Связано
Используя SO в качестве примера, какой самый разумный способ управлять тегами, если вы ожидаете, что они будут часто меняться?
Способ 1: Серьезно денормализован(с разделителями-запятыми)
table <b>posts</b>
+--------+-----------------+
| postId | tags |
+--------+-----------------+
| 1 | c++,search,code |
Здесь теги разделены запятыми.
Плюсы : теги извлекаются сразу с помощью одного запроса select
.Обновлять теги просто. Простое и дешевое обновление.
Минусы : дополнительный анализ при поиске тегов, трудно подсчитать, сколько сообщений используют какие теги.
(альтернативно, если ограничено чем-то вроде 5 тегов)
table <b>posts</b>
+--------+-------+-------+-------+-------+-------+
| postId | tag_1 | tag_2 | tag_3 | tag_4 | tag_5 |
+--------+-------+-------+-------+-------+-------+
| 1 | c++ |search | code | | |
Способ 2: «Слегка нормализовано» (отдельная таблица, без пересечения)
table posts
+--------+-------------------+
| postId | title |
+--------+-------------------+
| 1 | How do u tag? |
table taggings
+--------+---------+
| postId | tagName |
+--------+---------+
| 1 | C++ |
| 1 | search |
Плюсы : Легкочтобы увидеть количество меток (count(*) from taggings where tagName='C++'
).
Минусы : tagName, вероятно, будет повторяться много, много раз.
Способ 3: классный ребенок (нормализуется с пересечениемтаблица)
table <b>posts</b>
+--------+---------------------------------------+
| postId | title |
+--------+---------------------------------------+
| 1 | Why is a raven like a writing desk? |
table <b>tags</b>
+--------+---------+
| tagId | tagName |
+--------+---------+
| 1 | C++ |
| 2 | search |
| 3 | foofle |
table <b>taggings</b>
+--------+---------+
| postId | tagId |
+--------+---------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
Плюсы :
- Нет повторяющихся имен тегов.
- Вам понравятся больше девушек.
Минусы : Менять теги дороже, чем способ № 1.