2011-12-19 6 views
0

У меня есть пищевые продукты, которые могут принадлежать нескольким категориям, а категория может иметь много продуктов . Категории имеют иерархический характер:Как связать несколько записей друг с другом?

  • Продукты Питания> Органические
  • Продукты Питания> Обработанные

Я пытаюсь создать схему базы данных, сохраняя два ограничения в виду. Как я могу продолжить разработку схемы, чтобы поддержать это?

В качестве другого примера, мне кажется, что Stack Overflow имеет систему, подобную этой ... тегам. Каждый вопрос имеет несколько тегов, и каждый тег имеет несколько вопросов. Как это достигается? Как я могу адаптировать этот проект для моих потребностей в категоризации?

+1

См. Много-ко многим в [этот ответ] (http: // stackoverflow.com/questions/7296846/how-to-Implement-one-to-one-one-to-many-and-many-to-many-relationship-while-de/7296873 # 7296873) – NullUserException

ответ

1

Отношение «многие ко многим» в большинстве систем реляционных баз данных обычно состоит из двух таблиц базы данных, содержащих данные, о которых идет речь, а также промежуточной таблицы, которая связывает их. Что-то вроде этого:

Posts 
-------- 
ID 
Title 
Content 

Tags 
-------- 
ID 
Title 

PostTags 
-------- 
PostID 
TagID 

Это создает своего рода косвенное отношение между Posts и Tags через промежуточную таблицу. (Обратите внимание, что промежуточная таблица также может содержать столбец ID, если вы действительно этого хотите, но это может и не понадобиться. Имейте в виду, что добавление большего количества столбцов в эту таблицу представляет собой возможный риск создания неинтуитивного моделирования. Обычно это не большой сделка, но это то, что нужно учитывать при моделировании ваших данных. Добавление большего количества столбцов в эту таблицу может сделать «взаимосвязь» между моделями данных самой моделью.)

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

Products 
-------- 
ID 
Name 
Description 

Categories 
-------- 
ID 
Title 
ParentCategoryID 

ProductCategories 
-------- 
ProductID 
CategoryID 

Основное отличие в том, что Categories теперь таблица содержит столбец, который указывает обратно на собственной ID этой таблицы. Таким образом, у вас будет запись Food в этой таблице с величиной ID и, поскольку она находится на верхнем уровне в иерархии, значение null для ParentCategoryID. Тогда запись Organic будет иметь свое значение ID и будет использовать значение Food записи ID в своем поле ParentCategoryID. Это создает эту иерархию, не добавляя излишней сложности в модель данных.

Обратите внимание, что эта конструкция сама по себе не мешает кому-то из, скажем, категоризации как-то какFood и Organic. Если это не должно произойти, вам нужно еще больше усовершенствовать дизайн и ограничения, чтобы предотвратить его. В большинстве случаев подобное приложение отвергается в приложении, но было бы неплохо сделать это и в базе данных, если вы можете просто получить дополнительную гарантию целостности данных.

+0

Это было очень проницательно. Благодаря! Что касается иерархических категорий, я думаю, вы имеете в виду связанные списки? – brainydexter

+0

@brainydexter: Я представляю иерархию категорий как древовидную структуру. Каждый родительский узел может иметь несколько дочерних узлов, и каждый дочерний узел может иметь один родительский узел. Разве это не то, что вы имели в виду? Должны ли ваши категории также иметь отношения «многие-ко-многим»? – David

+0

Каждый родительский узел может иметь несколько дочерних узлов, и каждый дочерний узел может иметь один родительский узел. Это правильно, и именно так я смотрю. – brainydexter

3

Это отношение many-to-many. Вопрос может иметь много тегов, и у тега может быть много вопросов. В базе данных это представлено дополнительной таблицей (tag id и question id).

Смежные вопросы