Любые недостатки этого подхода тегирования - PullRequest
1 голос
/ 25 мая 2010

У меня есть таблица tags

ID      tag
---     ------
1       tagt
2       tagb
3       tagz
4       tagn

В моей таблице items я использую эти теги в сериализованном формате, разделенные запятыми

ID       field1       tags
----     ------       -----
1        value1       tagt,tagb
2        value2       tagb
3        value3       tagb,tagn
4        value4

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

Ответы [ 3 ]

2 голосов
/ 25 мая 2010

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

Например, что, если (неопределенный) тег tagc случайно добавляется в поле tags item? Код будет очень трудно отлаживать.

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

ID    item_id    tag_id    tagger_id    etc
-------------------------------------------

и хранить метаданные вместе с каждым тегом.

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

2 голосов
/ 25 мая 2010

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

1 голос
/ 25 мая 2010

Чтобы объяснить, что не так с вашим подходом тегирования, я покажу вам аналогичную ошибочную базу данных:

table Students
--------------------
Id     grade          names
--     -----          -----
1      Kindergarden   timmy, james, sarah, suzie, etc...
2      1st            annie, chris, laura, etc...
3      2nd            robert, kimmy, sarah, jason, etc...

Это неправильно по тем же причинам. Вы ничего не можете сделать с именами. Вы не можете их сосчитать, отфильтровать или даже вернуть только один из них.

Что, если вы захотите позже охладить вещи своими тегами, о которых вы сейчас не думаете?

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