Как грамотно организовать БД в данном случае?

Asar
На сайте с 23.08.2004
Offline
334
642

Имеем:

Таблицу основных элементов каталога (например, породы деревьев).

Таблицу дополнительных элементов (например, названия насекомых-вредителей этих деревьев).

Таблицу источников информации, из которых взяты данные о вредителях для каждого дерева.

Пример:

Дерево №1.

Его вредители №3 (источник информации №6),

№5 (источник информации №6),

№7 (источники информации №6, №7, №22).

Дерево №2.

Его вредители №3 (источники информации №6, №7),

№4 (источник информации №20),

№18 (источники информации №2, №8, №19).

Нужно:

Вывести данные для любого дерева примерно в том виде, как это указано в примере выше.

Вопрос:

Как грамотно хранить данные в БД? Ясно, что можно, например, в поле "Вредители" первой таблицы проставить Id этих самых вредителей, но как туда еще для каждого из них впихнуть источники информации (напоминаю, что источники будут разные для разных деревьев/вредителей) -- никак не дойду.

Прошу подсказать, если кто могет...

[Удален]
#1

3 таблицы: деревья, вредители, источники

+2 таблицы связей: вредитель-дерево, источник-вредитель-дерево. Здесь только id-шники элементов.

x-mobi.ru
На сайте с 30.12.2007
Offline
88
#2

Ну-у-у, у каждого дерева несколько вредителей, у вредителей по несколько источников. Следовательно, нужны связи:

Дерево - вредитель

Вредитель - источник

БД:

Таблица1: деревья

Таблица2: вредители

Таблица3: источники

Таблица4: связь дерево-вредитель

Таблица5: связь вредитель-источник

x-mobi.ru добавил 30.03.2009 в 02:11

nikitian:
источник-вредитель-дерево

А зачем тут "дерево"? Помоему лишнее

x-mobi.ru добавил 30.03.2009 в 02:21

Asar, на будущее запомните, если у вас в БД планируется хранение двух типов объектов, при этом, первый может включать в себя несколько вторых, то - все, однозначно нужна таблица связей :)

О_о
[Удален]
#3
x-mobi.ru:

А зачем тут "дерево"? Помоему лишнее

Для каждого дерева источник вредителей может быть разным, поэтому добавил его в таблицу. Прото подумал, что есть книга о берёзах, там рассказывается об ужасном лиственном вредителе. И есть книга о липах, там тоже о нём рассказывается, но применительно уже к липам. Могут быть разные способы заражения, симптомы и лечение.

Asar, в таблицах связей не забудьте сделать уникальный составной индекс по всем полям.

[Удален]
#4

Быдлокодеры понабежали.

Словосочетание Foreign Key вам о чем нибудь говорит?

В данном случае если для каждого дерева может быть несколько вредителей, а каждый вредитель может быть только у одного дерева, т.е. имеет место связь many-to-one, то достаточно в таблице вредителей сделать ключик tree_id с отсылкой на таблицу пород дерева.

Поскольку вряд ли один вредитель вредит одному дереву, но при этом для каждой породы дерева свой источник о каждом вредителе (связь many-to-many-by-one), то три таблицы - деревья, источники и вредители, в таблице вредители два внешних ключа на таблицу пород и таблицу источников, при этом имя вредителя и прочая связанная информация может дублироваться, но группа (имя вредителя, ид источника, ид породы) будет уникальная, можно прям constraint явно указать. Итого 3 таблицы в любом случае.

Ну а если связь many-to-many, то конечно нужна доп. таблица

[Удален]
#5

neolord, а тут как бэ и говорится о том, что связи везде "многие ко многим".

[Удален]
#6
nikitian:
neolord, а тут как бэ и говорится о том, что связи везде "многие ко многим".

тут как бэ и отвечается сразу, что нифига не многие-ко-многим...

[Удален]
#7
MOP1:
тут как бэ и отвечается сразу, что нифига не многие-ко-многим...

Есть деревья, есть вредители, есть источники информации. Один вредитель может быть у нескольких деревьев - это вроде логично. Об одном вредителе могут написать несколько источников для каждого дерева свой - это я вроде объяснил ранее. У дерева может быть несколько вредителей, вроде тоже вполне логично. Отсюда получаем связи:

Деревья-вредители: многие ко многим, т.к. у дерева много вредителей, вредитель жрёт несколько деревьев.

Вредители-источники: многие ко многим, т.к. об одном вредителе написано может быть несколько источников для каждого дерева свой. Один источник может описать несколько вредителей.

Asar
На сайте с 23.08.2004
Offline
334
#8

Да, связь будет множественная, в том и сложность. Т.е. могут быть совершенно разные сочетания дерево/вредитель/источник...

Спасибо всем ответившим, пойду пробовать/разбираться...

[Удален]
#9
MOP1:
тут как бэ и отвечается сразу, что нифига не многие-ко-многим

Читайте внимательнее:

nikitian:
книга о берёзах, там рассказывается об ужасном лиственном вредителе. И есть книга о липах, там тоже о нём рассказывается

Т.е. один вредитель также может несколько деревьев жрать, ну и у деврева несколько врежителей. Классический случай связи многие ко многим.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий