Предметы из нескольких категорий лучших практик - PullRequest
3 голосов
/ 16 декабря 2008

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

Спасибо за ваши ответы.

Извините за мой английский:)

Ответы [ 3 ]

8 голосов
/ 16 декабря 2008

Итак, у вас есть иерархия по категориям, да? Это один уровень (категория и категория ребенка) или любое количество (дети могут иметь детей и т. Д.)? Это повлияет на решение.

Как правило, вы бы смоделировали что-то подобное с отношением многих ко многим, например:

CREATE TABLE Item(
  item_id INT NOT NULL, 
  item_name VARCHAR(255) NOT NULL
)
CREATE TABLE Category(
  category_id INT NOT NULL, 
  category_name VARCHAR(255) NOT NULL
)
CREATE TABLE Item_Category(
  item_id INT NOT NULL REFERENCES Item(item_id), 
  category_id INT NOT NULL REFERENCES Category(category_id)
 )

Запись в "Item_Category" означает, что указанный элемент находится в указанной категории. Затем вы можете объединить 2 (или 3) из этих таблиц, чтобы увидеть, какие элементы в каких категориях:

SELECT I.* 
  FROM Item I 
    INNER JOIN Item_Category IC ON I.item_id = IC.item_id 
    INNER JOIN Category C on IC.category_id = C.category_id 
  WHERE 
    C.category_name = 'MyCategory'

Или какие категории есть у элемента:

SELECT C.*
  FROM Category C
    INNER JOIN Item_Category IC.category_id = C.category_id 
    INNER JOIN Item I on IC.item_id = I.item_id
  WHERE 
    I.item_name = 'MyItem'

Если в категориях есть иерархия, которая может быть выражена с использованием рекурсивных отношений в таблице категорий, например:

CREATE TABLE Category(
  category_id INT NOT NULL, 
  category_name VARCHAR(255) NOT NULL,
  parent_category_id INT NOT NULL REFERENCES Category(category_id)
)

Это усложняет ситуацию, потому что вы должны использовать рекурсивные запросы, чтобы получить все записи для категории и ее потомков. Проще, если у вас есть только два уровня категорий, просто сделать его вторым полем в таблице категорий, например:

CREATE TABLE Category(
  category_id INT NOT NULL, 
  category_name VARCHAR(255) NOT NULL,
  subcategory_name VARCHAR(255) NULL
)
3 голосов
/ 16 декабря 2008

если элемент может быть в нескольких категориях, то это не «категории». они больше похожи на теги.

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

0 голосов
/ 25 октября 2010

Как правило, лучшее решение, которое я нашел, которое работает в большинстве ситуаций, - это просто использовать поле parent_id в вашей таблице категорий. Таким образом, вам понадобится только одна таблица категорий. Это будет поддерживать любое количество уровней или только один, если вы хотите (в этом случае в вашем коде будет необходимо предотвратить возможность создания категории третьего уровня).

Например:
CREATE TABLE category ( id INT NOT NULL AUTO_INCREMENT, parent_id INT NOT NULL DEFAULT '0' name VARCHAR(255) NOT NULL ) Так проще. Любая категория с parent_id 0 будет вашим самым верхним уровнем. Если у вас есть категория с идентификатором 1 и вы создаете подкатегорию, ее parent_id будет 1 и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...