|
|
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
Делаем на стажировке интернет магазин. База данных на sql server, а сайт будем делать на asp.net mvc 5. На данный момент база выглядить следующим образом: Поскольку будем пользоваться пакетом Microsoft.Asp.Identity, 5 таблиц было сгенерировано EntityFramewor-ком вместо нам, а именно: AspNetRoles, AspNetUserRoles, AspNetUsers, AspNetUserLogins, AspNetUserClaims. Интересуют правильно ли я наладил связи между таблицами. Отвечу на любые вопросы если таковые возникнут. Так же хотел бы спросить. В таблице Orders, у меня есть атрибут OrderStatus. Его дефиниция выглядит следующим образом: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Сделал я это с намерением, при моделировании сущьности создать enum из этих значений. Насколько целесообразна такая практика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2016, 21:50 |
|
||
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
Сейчас на прогулке на свежем воздухе, сразу же обнаружил банальную ошибку, а именно, вместо отношения много-ко-многим между Orders и Products, у меня было связь один-ко-многим. Исправил. Заодно выложу SQL, может будет кому удобнее просматривать в Management Studio ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2016, 23:05 |
|
||
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
unsafeВ таблице Orders, у меня есть атрибут OrderStatus. Его дефиниция выглядит следующим образом: Код: sql 1. 2. Сделал я это с намерением, при моделировании сущьности создать enum из этих значений. Насколько целесообразна такая практика. Это хорошо и правильно: БД должна по максимуму проверять данные на допустимость. Но в данном случае, я бы статусы выделил в отдельный справочник, это улучшит гибкость и расширяемость в дальнейшем. А также позволит дать текстовую расшифровку статусов (их потом можно будет использовать в GUI). Для подобных справочников лично я не люблю заводить целочисленные суррогатные ключи. Я завожу ключ типа VARCHAR с небольшой длиной (в вашем случае, наверное, хватит двух символов) и заполняю его значениями, удобными для запоминания. Такой ключ я называю "мнемоключом". Его удобство в том, что он сочетает свойства как суррогатных ключей (не изменяется после присваивания; имеет малый размер в памяти; значение ничего не значит в рамках предметной области), так и интеллектуальных (значение легко запоминается; во время формирования не зависит от значения sequence, поэтому мы заранее можем завязаться на его значение в прикладных программах и аналитике; при обработке значения можно обойтись значением в таблице данных без обращения к таблице-справочнику). Т.е. заведи таблицу OrderStatusDict: Id name'DC' declined'AC' 'accepted''PY' 'paid''SH' 'shipped''DV' delivered' , и из таблицы Orders ссылайся на её поле Id. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 09:16 |
|
||
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
Владимир П., Большое спасибо за отзыв. В первую очередь ставя check на поле, я хотел избежать создание новой таблицы, руководствуясь тем, что записи в неё добавляться на вряд ли будут, а значит лучше нам сэкономить на Join. Но ваш вариант, как я считаю более приемлив, так как мы тем самым, обезопасиваем от ввода ложных данных, к тому же джойни так же можно избежать, просто запомнив аббревиатуры. Кое какие детали при проектировании я конечно упустил, так как, делал сначала на листике..возможно глупо, но я так привык. Например в Products нужно ввести текущую цену продукта. Она ведь может изменится. Как в таком случае поступить? Вкрадывается идея сделать отдельную таблицу, которая по внешнему ключу будет держать id продукта, и добавить триггер на Update, в случае изменения цены, что бы добавлялась строка с предыдущей стоимостью товара. Однако, Orders могут содержать несколько продуктов, то есть перед самым оформлением заказы, надо будет как то проверить а не изменилась ли цена продукта, держать булевый атрибут для каждой записи мне кажется не очень целесообразным, ведь цена товара не так часто меняется. Вот как это реализовать? Будет ещё один вопрос по поводу именования. Атрибут Ordered в таблице Orders, на данный момент у меня отражает дату заказа. Было бы более понятно если бы мы переименовали название в OrderDate? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 10:33 |
|
||
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
unsafeлучше нам сэкономить на Join А что, MS SQL так слаб, что один джоин его убьёт?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 11:48 |
|
||
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Нет разумеется, просто я бд больше 5 таблиц никогда не делал, вот и экспериментирую. Что насчёт другого вопроса? Можно услышать Ваше мнение по этому поводу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 12:44 |
|
||
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
unsafeНапример в Products нужно ввести текущую цену продукта. Она ведь может изменится. Как в таком случае поступить? Вкрадывается идея сделать отдельную таблицу, которая по внешнему ключу будет держать id продукта, и добавить триггер на Update, в случае изменения цены, что бы добавлялась строка с предыдущей стоимостью товара. Однако, Orders могут содержать несколько продуктов, то есть перед самым оформлением заказы, надо будет как то проверить а не изменилась ли цена продукта, держать булевый атрибут для каждой записи мне кажется не очень целесообразным, ведь цена товара не так часто меняется. Вот как это реализовать? Делать дополнительную таблицу с ценами и датами - правильная идея,+ в заказ можно копировать текущую цену товара. Последнее не обязательно, но с точки зрения ускорения запросов даст куда больше, чем отказ от несчастного join таблицы статусов. У Вас на схеме еще что-то странное с comment'ами - выходит что комментарий может относиться сразу к нескольким товарам. Вы это и имели в виду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 13:01 |
|
||
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
unsafeЧто насчёт другого вопроса? Можно услышать Ваше мнение по этому поводу. Ответ на второй вопрос надо искать в ТЗ: на какой момент фиксируется цена товара при покупке. И таки да, её можно и нужно копировать непосредственно в номенклатуру заказа в момент фиксации. И никакая дополнительная таблица, флаг или триггер не нужны. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 13:10 |
|
||
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Да, Вы правы, с комментариями ошибка вышла, один продукт может иметь много комментариев, и один комментарий может принадлежать одному продукту, значит отношение один-ко-многим. На счёт продуктов и заказов, логика следующая..представим себе что пользователь добавляет множество продуктов в корзину, перед тем как окончательно оформить заказ, надо проверить а не изменилась ли цена на какой-то продукт, если цена была изменена вывести пользователю предупреждение об изменении, если пользователь согласен с изменением цены на конкретный продукт, суммировать общую стоимость всех выбранных продуктов и сформировать окончательную цену и записать её в Заказы. Теперь как отобразить логику в бд об изменении цены? К тому же, например, у нас в наличие 100пар обуви, кто то и заказчиков купил 15, значит мы должны отобразить как-то что теперь по этому продукту у нас осталось 85пар. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 13:36 |
|
||
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
unsafeперед тем как окончательно оформить заказ, надо проверить а не изменилась ли цена на какой-то продукт У вас так в ТЗ написано? Обычно этого делать не надо, поскольку цена меняется редко. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 14:10 |
|
||
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, авторCategories, Child Categories (tree structure), Name, Description, Create/Update/Delete Branch (delete category and child categories) Products in 1 category, Name, Description, Price, Quantity, Active... Tags - each product can have multiple tags Users (registration, no external login) - use ASP.NET Identity - Admin role - can promote other admins - Product Manager - can create new products and edit products - Moderator can delete comments on products - Seller can mark orders as completed - Everyone can buy things and post comments Comments on products (flat), no anonymous comments, Text, Author, IP Address, IsDeleted (do not delete comments just hide them) - comments are added via pure client side AJAX (no action links, just jQuery) Product list, filter by category search in name (Use LIKE), paging, filters in URL, when the user opens the URL he should immediately see the product list (search engine friendly), the URLs should change even when the page is changed via AJAX Orders - customers can place orders, orders record the items, the current price at the moment of the order, the address of the customer in the moment of the order, checks if the customer has address, a Seller can mark the order as new, in progress or completed, the customer can see the status of the order Admin Panel for managing users, seeing deleted comments, choose front-end technology (Angular, Angular2, React, Ember...), backend with ASP.NET WebAPI Нам ТЗ ментор написал за 5минут, так что очень много чего мы будем походу работы добавлять и дорабатывать. Я честно говоря не знаю как поступить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 14:23 |
|
||
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
unsafethe current price at the moment of the order Какое слово тебе непонятно? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 14:26 |
|
||
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Я не много запутался, отношение между Заказами и Продуктами много-ко-многим должно быть? В задании сказано 'orders record the items'. У меня как такой таблицы items нету, я подразумевал что продукт это есть наши items. На данный момент БД после всех исправлений выглядит во так: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 14:42 |
|
||
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
unsafeВ задании сказано 'orders record the items'. У меня как такой таблицы items нету, я подразумевал что продукт это есть наши items. Нет, продукты это продукты, а спецификация заказа это спецификация заказа. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2016, 15:03 |
|
||
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
Пропустил один пункт. Есть у нас таблица Categories, у которой атрибут ParentId является внешним ключом на таблицу Categories, тем самым мы реализуем древовидную структуру. Как нам реализовать удаление категории? То есть если мы удаляем один из листьев дерева, то разумеется никаких проблем. В случае же если на наш узел ссылаются, то удаление запрещено. Вешать ON CASCADE DELETE на внешний ключ запрещает SQL Server. Остаётся два варианта, триггер или процедура. Поскольку триггер использует по умолчанию операцию AFTER, то есть мы его вешаем на операцию DELETE то ничего не достигаем, потому как удаление узла на который ссылаются, запрещено. Значит надо использовать INSTEAD OF, да же всё получилось реализовать. Вот только беда что теперь мы в каком то смысле ограничены. Можно удалять теперь запись только по определенному id. Я понимаю, что это конечно маловероятно, но допустим чисто теоретически придётся удалить все записи где в описании категорий будет матерное слово. И в этот момент мы получается ограничены, ведь не можем воспользоваться DELETE. Остаётся вариант с использованием процедуры, но мои результаты поиска к внятному описанию с реализацией ни к чему не привели. Может кто поделится опытом, что делать в такой ситуации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 00:25 |
|
||
|
Структура интернет магазина
|
|||
|---|---|---|---|
|
#18+
unsafeПропустил один пункт. Есть у нас таблица Categories, у которой атрибут ParentId является внешним ключом на таблицу Categories, тем самым мы реализуем древовидную структуру. Как нам реализовать удаление категории? То есть если мы удаляем один из листьев дерева, то разумеется никаких проблем. В случае же если на наш узел ссылаются, то удаление запрещено. Вешать ON CASCADE DELETE на внешний ключ запрещает SQL Server. Остаётся два варианта, триггер или процедура. ИМХО, для работы с деревом категорий (глубина вложенности как правило меньше 5-ти, глубже категории не "Юзабилити") - можно использовать рекурсивную функцию и валить записи физически (delete from ...). Но я использую для этого просто флаг: del=1 - удален. Ясно, что флаг del потом надо таскать в запросах, зато путаницы никакой. Для совсем мертвых (dateDel>1 года) - можно "зачищать" базу - удалять физически. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2016, 07:21 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=39262629&tid=1540310]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
152ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 250ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...