powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Нужен совет по "правильному" проектированию.
22 сообщений из 22, страница 1 из 1
Нужен совет по "правильному" проектированию.
    #38881645
khrenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Обращаюсь за помощью.
Начальные данные из предметной области:
Есть три сущности: прибор, блок, аксессуар.
Прибор состоит из блоков.
Прибор может поставляться с аксессуарами или без них.
Приборы бывают разных видов, и, соотвественно, состоят из разных блоков.
Аксессуары тоже бывают разные, и поставляются с разными видами приборов.

Прибор, блок и аксессуар имеют некоторые общие характеристики, например, серийный номер, дата изготовления, тип и пр. (общие в том смысле, что характеристика "тип" есть и у прибора и у блока и у аксессуара, но ее значения различаются для разных сущностефывй.).
Помимо общих характеристик приборы, аксессуары и блоки имеют уникальные характеристики (прибор, например, характеризуется цветом и весом, а блок и аксессуар - нет).

Необходимо учитывать:
- все созданные приборы, блоки и аксессуары (хранить их характеристики)
- из каких блоков состоит прибор.
- с какими аксессуарами поставляется прибор.

Исходя из вышеперечисленного вижу два варианта реализации базы.
1 вариант:

Создать таблицу (назовем ее "А"), в которой хранить записи о приборах, блоках и аксессуарах. В этой таблице атрибутами будут общие для трех сущностей характеристики.
Уникальные же характеристики для каждой сущности предполагаю хранить в отдельных таблицах в отношении 1:1 к записям таблицы "А".
А также:
создать одну общую таблицу-справочник типов, в которой будут занесены и типы приборов, и типы блоков, и типы аксессуаров.
создать таблицу-связь, в которой будет учитываться из каких блоков состоит прибор.
создать таблицу-связь, в которой будет учитываться с какими аксессуарами поставляются приборы.

2 вариант:
Создать три таблицы, в каждой из которых будут храниться записи о приборах, блоках и аксессуарах соответсвенно.(в каждой из указанных таблиц будут общие атрибуты и атрибуты уникальные для отдельной сущности)
Для каждой из указанных выше таблиц сделать таблицу-справочник, в которых указать типы, характерные только для отдельной сущности.
Также как и в первом варианте, создать 2 таблицы-связи.

+/- 1 варианта:
Плюсы:
- Отсутсвует дублирование атрибутов.
- Меньшее количество таблиц по сравнению со вторым вариантом.

Минусы:
- Записи о разных сущностях хранятся в одной таблице.
- Несколько таблиц в отношении 1:1.
- Справочная таблица типов содержит типы всех сущностей, что, например, может привести к ошибочному выставлению для записи прибора значения поля "тип", характерного для блока или аксессуара.
- Таблицы связи будут связывать записи из одной таблицы ("А").

+/- 2 варианта:
Плюсы:
- Записи таблиц-связей формируются из ключей разных таблиц (на мой взгляд это снижает вероятность ошибки при формировании таблиц-связей.)
- Таблицы-справочники хранят записи, характерные только для одной сущности (на мой взгляд это снижает вероятность ошибки при составлении записи)
- Записи, относящиеся к одной сущности хранятся в одтельной таблице.
- Нет таблиц в отношении 1:1.

Минусы:
- Дублирование общих атрибутов в таблицах.
- Большее количество таблиц по сравнению с первым вариантом.

Подскажите, пожалуйста, какой из вариантов предпочтительней?
Я больше склоняюсь ко второму варианту.
Возможно, рациональное решение не ограничивается этими двумя вариантами?
Проектирую в рамках MySQL.
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38881663
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
khrenkov- Большее количество таблиц по сравнению с первым вариантом.
Первый вариант требует как минимум шесть таблиц. Второй - только пять. У тебя всё хорошо с
арифметикой?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38881709
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
khrenkov.
Минусы:
- Записи о разных сущностях хранятся в одной таблице.

Это зависит от того, как делить предметную област на "сущности". Например, можно считать что в таблице А лежит одна сущность "учетная единица", а уже в дочерних - соответсвенно, приборы, блоки и аксессуары.

khrenkov.
- Несколько таблиц в отношении 1:1

Cтрого говоря, не 1:1, а 1:0..1 - а это уже вполне допустимо.

khrenkov.

- Справочная таблица типов содержит типы всех сущностей, что, например, может привести к ошибочному выставлению для записи прибора значения поля "тип", характерного для блока или аксессуара.

Это решаемая проблема - например, можно добавить в первичный ключ справочника поле "тип учетной сущности" и сделать соответствующий foreign key

(Я уже писал недавно) Имхо определяться с вопросом "одна таблица или несколько?" надо по ответу "Много ли единообразных обработок?"
Например, если Вы будете приделывать складской учет к своей системе - на склад, скорее всего, будут обинаково приниматься и приборы и блоки и аксессуары, с этих позиций одна таблица - благо.
Если единообразных обработок нет и не предвидится - тогда лучше будет вариант 2, потому что он проще.
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38881720
khrenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
Количество таблиц:
1 вариант: общая таблица(общие атрибуты) + по одной таблице для сущностей(а сущностей 3)(уникальные атрибуты) + общий справочник = 5;
2 вариант: для каждой сущности по таблице (общие + уникальные атрибуты) + для каждой сущности по справочнику = 6;
Таблицы-связи я не считаю.
6 > 5;

В постановке задачи в первом сообщении я немного упростил условие.
Например, есть еще характеристика "статус", которая относится ко всем сущностям, но значения для нее должны быть разные для разных сущностей.
Первый вариант подразумевает создание одной таблицы-справочника, в котором будут перечислены все статусы для всех сущностей.
Второй же вариант предполагает создание трех таблиц-справочников, каждая из которых будет содержать статусы, характерные для той или иной сущности.
Т.о. добавление новой общей характеристики, значение которой берется из справочника, в первом варианте предполагает дополнительное создание 1 таблицы, а во втором - 3х.
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38881747
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
khrenkov2 вариант: для каждой сущности по таблице (общие + уникальные атрибуты) +
для каждой сущности по справочнику = 6;
Что за "справочник" и чем он отличается от таблицы, содержащей атрибуты?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38881751
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
khrenkovВторой же вариант предполагает создание трех таблиц-справочников, каждая из
которых будет содержать статусы, характерные для той или иной сущности.
Количество этих статусов достаточно велико чтобы третья НФ принесла пользу? На малом
количестве она скорее мешает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38881762
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovkhrenkovВторой же вариант предполагает создание трех таблиц-справочников, каждая из
которых будет содержать статусы, характерные для той или иной сущности.
Количество этих статусов достаточно велико чтобы третья НФ принесла пользу? На малом
количестве она скорее мешает.

Как "польза от третьей НФ" связана с количеством статусов (т.е. записей в справочной таблице)?
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38881778
khrenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovkhrenkovВторой же вариант предполагает создание трех таблиц-справочников, каждая из
которых будет содержать статусы, характерные для той или иной сущности.
Количество этих статусов достаточно велико чтобы третья НФ принесла пользу? На малом
количестве она скорее мешает.

Каждый справочник определяет домен атрибута для каждой сущности.
Например:
И приборы, и блоки, и аксессуары имеют атрибут "тип".
Приборы могут быть только типа "А" или "Б", блоки - "Ц", "Д" или "Е", а аксессуары - "Ф" или "Ж".
Поэтому справочник "типа" для приборов будет иметь записи "А" и "Б", для аксессуаров - "Ц", "Д" и "Е", для аксессуаров - "Ф" и "Ж".
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38881794
khrenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В предыдущем сообщении отвечал на это:
Dimitry Sibiryakovkhrenkov2 вариант: для каждой сущности по таблице (общие + уникальные атрибуты) +
для каждой сущности по справочнику = 6;
Что за "справочник" и чем он отличается от таблицы, содержащей атрибуты?
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38881795
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
khrenkovПоэтому справочник "типа" для приборов будет иметь записи "А" и "Б", для
аксессуаров - "Ц", "Д" и "Е", для аксессуаров - "Ф" и "Ж".
А если на "тип" вообще не создавать справочник?.. Для двух или трёх значений без
дополнительных атрибутов вполне хватит check constraint.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38881879
khrenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovА если на "тип" вообще не создавать справочник?.. Для двух или трёх значений без
дополнительных атрибутов вполне хватит check constraint.

Думаю, что это решение не подойдет: домен атрибута "тип" содержит набор строк. Справочник здесь лучше впишется.
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38882034
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
khrenkovдомен атрибута "тип" содержит набор строк. Справочник здесь лучше впишется.

Справочник из одного поля, содержащий две записи?.. Ну-ну...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38882199
khrenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот Матроскин, спасибо за совет!
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38882208
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
khrenkov,

я вижу вообще тонко один вариант. почитать тз и создать базу.
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38882260
Вячеслав Э
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivkhrenkov,

я вижу вообще тонко один вариант. почитать тз и создать базу.

Согласен.
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38882397
khrenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv, ТЗ пишу я.
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38883382
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
khrenkov,

Значит, сначала напиши, потом его прочитай, и сделай, как надо БД.
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38883386
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПодскажите, пожалуйста, какой из вариантов предпочтительней?


ПЕРВЫЙ.
называется это отношение подкатегории, оно же наследование.
Как это хорошо делать теперь достаточно хорошо написано, как ни странно,
в документации/книгах по Hibernate -- там кстати описаны все виды реализации
наследования в РСУБД, с их достоинствами и недостатками, рекомендую прочитать.
Этот вариант реализации там под каким-то номером идёт, второй или третий.
Он лучше всего, потому что не предполагает никаких РСУБД -аномалий -- естественный для РБД,
и наиболее гибкий, как по проектированию БД и дальнейшему её расширению, так и по обработке
данных.


автор
Возможно, рациональное решение не ограничивается этими двумя вариантами?

Да, есть ещё EAV и другие schemaless DB (первое универсально для любой РСУБД, второе должно поддерживаться СУБД)
авторПроектирую в рамках MySQL.

Всё равно.
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38883784
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivавторПодскажите, пожалуйста, какой из вариантов предпочтительней?


ПЕРВЫЙ.
...
Он лучше всего, потому что не предполагает никаких РСУБД -аномалий.

Какие "РСУБД-аномалии" предполагает вариант №2?
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38884089
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот Матроскин,

автор2 вариант:
Создать три таблицы, в каждой из которых будут храниться записи о приборах, блоках и аксессуарах соответсвенно.(в каждой из указанных таблиц будут общие атрибуты и атрибуты уникальные для отдельной сущности)
Для каждой из указанных выше таблиц сделать таблицу-справочник, в которых указать типы, характерные только для отдельной сущности.
Также как и в первом варианте, создать 2 таблицы-связи.



Вот то, что общие атрибуты храняться в 3-х таблицах.
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38884235
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivКот Матроскин,

автор2 вариант:
Создать три таблицы, в каждой из которых будут храниться записи о приборах, блоках и аксессуарах соответсвенно.(в каждой из указанных таблиц будут общие атрибуты и атрибуты уникальные для отдельной сущности)
Для каждой из указанных выше таблиц сделать таблицу-справочник, в которых указать типы, характерные только для отдельной сущности.
Также как и в первом варианте, создать 2 таблицы-связи.



Вот то, что общие атрибуты храняться в 3-х таблицах.

Т.е. если у меня в таблице Проводки и таблице Контракты есть "общий" атрибут Сумма - то это "РСУБД аномалия"?
Ой.
...
Рейтинг: 0 / 0
Нужен совет по "правильному" проектированию.
    #38884375
khrenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv, спасибо за советы!
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Нужен совет по "правильному" проектированию.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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