powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Правильно спроектировать предметную область
7 сообщений из 7, страница 1 из 1
Правильно спроектировать предметную область
    #39849491
ogienko_ev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер, есть некая предметная область, в которой основными сущностями выступают:

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 можно добавить запись, где продукт связывается с параметром, который не относится к категории, к которой относится продукт.
Да, на программном уровне это можно легко обыграть, но меня волнует, как наложить ограничения именно на уровне бд.

И вообще адекватное ли решение для данной задачи?
Буду благороден помощи.
...
Рейтинг: 0 / 0
Правильно спроектировать предметную область
    #39849499
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задлянафига смешивать два понятия параметры для продуктов и категорий. Заведите две таблицы.
...
Рейтинг: 0 / 0
Правильно спроектировать предметную область
    #39849503
ogienko_ev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257,
В данном случае, сущность параметры для продуктов и категорий одна. Это одно понятие.
...
Рейтинг: 0 / 0
Правильно спроектировать предметную область
    #39849554
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ogienko_ev,

- имхо CategoryParameters - избыточная таблица (то есть таблица состоящая только из FK),
ну это как рассматривать просто пару слов Вася + Оля... Кто они? Муж и жена? Брат и сестра? Сотрудники конторы? На основании чего? В какой период? Ну как бэ просто не имеет прямого смысла...
- слабое место Categories (с внутренней иерархией и неопределенным количеством уровней иерархии)
- если Value разнородное значение, то это или будет Char или в параметры добавлять его тип и попадаем на вложенную иерархию + EAV.... Готов к такому повороту ?
...
Рейтинг: 0 / 0
Правильно спроектировать предметную область
    #39849632
ogienko_ev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmag,
Спасибо большое за ответ, твое решение намного лучше того, что я предложил. На основании твоих доводов, появились ещё вопросы

1) Категории должны иметь иерархию, по предметной области. Если ты говоришь, что вложенность это плохо, как избавится от этой проблемы? Добавить поле веса (уровня)?

2) Изначально, я планировал хранить значения параметров в строке, но подумав, да у параметров могут быть разные типы данных, и теперь как это реализовать? Может вообще стоит отказаться от паттерна EAV и хранить все параметры в таблице продукты?
...
Рейтинг: 0 / 0
Правильно спроектировать предметную область
    #39849729
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ogienko_evДа, на программном уровне это можно легко обыграть, но меня волнует, как наложить ограничения именно на уровне бд.
Можно прямым и естественным образом. Добавьте в ProductParameters поле CategoryId. Сошлитесь из неё на Products по составному ключу (ProductId, CategoryId). По этому же составному ключу сошлитесь из ProductParameters на CategoryParameters. Единственно, таким образом Вы не сможете обыграть иерархию в категориях. Декларативные ограничения целостности в СУБД не позволяют проверять принадлежность ветке дерева.

Кроме того, существует хакерский путь, которым я пользуюсь в Oracle для того, чтобы декларативно реализовывать "забубенистые" ограничения, не выражаемые нормальными способами (например, вот такую ситуацию с деревом). Для этого я делаю materialized view с опцией refresh on commit. В условиях where я прописываю критерии отбора записей, нарушающих требуемое ограничение (то есть в Вашем случае view должно выдавать записи параметров, в которых категории не соответствуют продукту). А теперь фокус! В части select этого view я пишу что-нибудь типа raise_application_error('Параметр не из той категории!'). И вуаля! Как только меняются данные в одной из задетых таблиц - view пересчитывается, и если в нём появляется хотя бы одна запись - вылетает ошибка и данные не сохраняются. Красота!
...
Рейтинг: 0 / 0
Правильно спроектировать предметную область
    #39849733
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ogienko_evЕсли ты говоришь, что вложенность это плохо

- скорее трудоемко, хотя у тех кто имет опыт работы с этим, особых проблем не возникает, если иерархия очевидна и её можно стандартизировать до 2-х, максимум 3-х уровней, то её можно сделать в виде отдельных таблиц с иерархией.

ogienko_evда у параметров могут быть разные типы данных, и теперь как это реализовать? Может вообще стоит отказаться от паттерна EAV

- нужно смотреть предметную область, опять же... если параметров максимум 10 и больше не предвидится в обозримом будущем, то возможно проще их засунуть в продукты и потом рулить их показом в интерфейсе в соответствии с категориями...
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Правильно спроектировать предметную область
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]