Как бороться с тегами в нормализованной базе данных? - PullRequest
1 голос
/ 24 декабря 2010

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

Хотите ли вы иметь таблицу с вашими тегами, а затем ограничить количество тегов на тест?

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

Ответы [ 2 ]

4 голосов
/ 24 декабря 2010

Обычно это делается для использования двух таблиц. Таблица tags, где каждая запись состоит из tag_id и tag_name (и, возможно, других метаданных, которые вы хотите включить). Затем теги будут связаны с их тестами через другую таблицу, test_tags, в которой будут храниться test_id и tag_id.

Если вы хотите ограничить количество тегов в тесте, вы можете легко выполнить запрос SELECT COUNT(tag_id) FROM test_tags WHERE test_id=#, чтобы выяснить, сколько они уже добавили в него.

2 голосов
/ 24 декабря 2010

Обычно, как вы могли бы сделать это, было бы иметь одну таблицу tags, например:

INT id PRIMARY KEY
VARCHAR(255) name

Затем для каждого объекта, которому вы разрешите пометить, вам нужна таблица моста. Поэтому, если у вас есть другая таблица tests с собственным столбцом id, у вас будет другая таблица, tests_tags:

INT test_id PRIMARY KEY
INT tag_id PRIMARY KEY

Затем вы можете перечислить все тесты с тегом, получив идентификаторы тестов, где tag_id - интересующий вас идентификатор тега; аналогично вы можете перечислить все теги в тесте, получив идентификаторы тегов, где test_id - это интересующий вас идентификатор теста.

Это стандартный способ моделирования отношений «многие ко многим».

...