Отношение «многие ко многим» в большинстве систем реляционных баз данных обычно состоит из двух таблиц базы данных, содержащих данные, о которых идет речь, а также промежуточной таблицы, которая связывает их. Что-то вроде этого:
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
. Если это не должно произойти, вам нужно еще больше усовершенствовать дизайн и ограничения, чтобы предотвратить его. В большинстве случаев подобное приложение отвергается в приложении, но было бы неплохо сделать это и в базе данных, если вы можете просто получить дополнительную гарантию целостности данных.
См. Много-ко многим в [этот ответ] (http: // stackoverflow.com/questions/7296846/how-to-Implement-one-to-one-one-to-many-and-many-to-many-relationship-while-de/7296873 # 7296873) – NullUserException