|
Правильно спроектировать предметную область
|
|||
---|---|---|---|
#18+
Добрый вечер, есть некая предметная область, в которой основными сущностями выступают: Products Id Title Description CategoryId Param #1 Param #1 Param #1 Categories Id Name ParentId Parameters Id Name Сущность Products имеет внешний ключ на сущность Categories , т.е. предоставляет какую-либо категорию. Сущность Products должна иметь несколько постоянных параметров, таких как Param #1, Param #2, Param #3 и зависимости от типа категории еще набор параметров Я добавил таблицу CategoryParameters : CategoryParameters CategoryId ParameterId Т.е. связываем названия параметров для каждой категории. У каждой категории может быть свой набор параметров. А так, же ProductParameters : ProductParameters ProductId ParameterId Value Где связываю конкретный продукт с параметрами и назначаю значению конкретного параметра для конкретного продукта. Схема: Меня беспокоит, что в таблицу ProductParameters можно добавить запись, где продукт связывается с параметром, который не относится к категории, к которой относится продукт. Да, на программном уровне это можно легко обыграть, но меня волнует, как наложить ограничения именно на уровне бд. И вообще адекватное ли решение для данной задачи? Буду благороден помощи. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2019, 20:52 |
|
Правильно спроектировать предметную область
|
|||
---|---|---|---|
#18+
Задлянафига смешивать два понятия параметры для продуктов и категорий. Заведите две таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2019, 21:35 |
|
Правильно спроектировать предметную область
|
|||
---|---|---|---|
#18+
SERG1257, В данном случае, сущность параметры для продуктов и категорий одна. Это одно понятие. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2019, 21:41 |
|
Правильно спроектировать предметную область
|
|||
---|---|---|---|
#18+
ogienko_ev, - имхо CategoryParameters - избыточная таблица (то есть таблица состоящая только из FK), ну это как рассматривать просто пару слов Вася + Оля... Кто они? Муж и жена? Брат и сестра? Сотрудники конторы? На основании чего? В какой период? Ну как бэ просто не имеет прямого смысла... - слабое место Categories (с внутренней иерархией и неопределенным количеством уровней иерархии) - если Value разнородное значение, то это или будет Char или в параметры добавлять его тип и попадаем на вложенную иерархию + EAV.... Готов к такому повороту ? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2019, 01:38 |
|
Правильно спроектировать предметную область
|
|||
---|---|---|---|
#18+
vmag, Спасибо большое за ответ, твое решение намного лучше того, что я предложил. На основании твоих доводов, появились ещё вопросы 1) Категории должны иметь иерархию, по предметной области. Если ты говоришь, что вложенность это плохо, как избавится от этой проблемы? Добавить поле веса (уровня)? 2) Изначально, я планировал хранить значения параметров в строке, но подумав, да у параметров могут быть разные типы данных, и теперь как это реализовать? Может вообще стоит отказаться от паттерна EAV и хранить все параметры в таблице продукты? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2019, 10:58 |
|
Правильно спроектировать предметную область
|
|||
---|---|---|---|
#18+
ogienko_evДа, на программном уровне это можно легко обыграть, но меня волнует, как наложить ограничения именно на уровне бд. Можно прямым и естественным образом. Добавьте в ProductParameters поле CategoryId. Сошлитесь из неё на Products по составному ключу (ProductId, CategoryId). По этому же составному ключу сошлитесь из ProductParameters на CategoryParameters. Единственно, таким образом Вы не сможете обыграть иерархию в категориях. Декларативные ограничения целостности в СУБД не позволяют проверять принадлежность ветке дерева. Кроме того, существует хакерский путь, которым я пользуюсь в Oracle для того, чтобы декларативно реализовывать "забубенистые" ограничения, не выражаемые нормальными способами (например, вот такую ситуацию с деревом). Для этого я делаю materialized view с опцией refresh on commit. В условиях where я прописываю критерии отбора записей, нарушающих требуемое ограничение (то есть в Вашем случае view должно выдавать записи параметров, в которых категории не соответствуют продукту). А теперь фокус! В части select этого view я пишу что-нибудь типа raise_application_error('Параметр не из той категории!'). И вуаля! Как только меняются данные в одной из задетых таблиц - view пересчитывается, и если в нём появляется хотя бы одна запись - вылетает ошибка и данные не сохраняются. Красота! ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2019, 13:05 |
|
Правильно спроектировать предметную область
|
|||
---|---|---|---|
#18+
ogienko_evЕсли ты говоришь, что вложенность это плохо - скорее трудоемко, хотя у тех кто имет опыт работы с этим, особых проблем не возникает, если иерархия очевидна и её можно стандартизировать до 2-х, максимум 3-х уровней, то её можно сделать в виде отдельных таблиц с иерархией. ogienko_evда у параметров могут быть разные типы данных, и теперь как это реализовать? Может вообще стоит отказаться от паттерна EAV - нужно смотреть предметную область, опять же... если параметров максимум 10 и больше не предвидится в обозримом будущем, то возможно проще их засунуть в продукты и потом рулить их показом в интерфейсе в соответствии с категориями... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2019, 13:14 |
|
|
start [/forum/topic.php?fid=32&msg=39849632&tid=1539917]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
48ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
others: | 246ms |
total: | 394ms |
0 / 0 |