Рекомендуемый дизайн базы данных SQL для тегов или тегов

Обычно я соглашусь с Яаковом sqlselect Эллисом, но в этом особом table-design случае есть другое жизнеспособное schema-design решение:

Используйте две таблицы:

Table: Item
Columns: ItemID, Title, Content
Indexes: ItemID

Table: Tag
Columns: ItemID, Title
Indexes: ItemId, Title

У data-modelling этого есть несколько основных table-design преимуществ:

Во-первых, это table-design значительно упрощает разработку: в database-design решении с тремя таблицами schema-design для вставки и обновления data-modelling item вам нужно найти таблицу schema-design Tag, чтобы увидеть, есть ли tag уже записи. Тогда вы должны data-modelling присоединить к ним новые. Это data-modeling нетривиальная задача.

Затем database-modeling он делает запросы проще (и, возможно, быстрее). Вам sqlselect нужно выполнить три основных sqlselect запроса к базе данных: вывести sql-syntax все Tags для одного Item, нарисовать sql-syntax облако тегов и выбрать все sql-query элементы для одного заголовка sql-syntax тега.

Все теги для одного элемента:

3 стола:

SELECT Tag.Title 
  FROM Tag 
  JOIN ItemTag ON Tag.TagID = ItemTag.TagID
 WHERE ItemTag.ItemID = :id

2 стола:

SELECT Tag.Title
FROM Tag
WHERE Tag.ItemID = :id

Облако тегов:

3 стола:

SELECT Tag.Title, count(*)
  FROM Tag
  JOIN ItemTag ON Tag.TagID = ItemTag.TagID
 GROUP BY Tag.Title

2 database-modeling стола:

SELECT Tag.Title, count(*)
  FROM Tag
 GROUP BY Tag.Title

Элементы для одного тега:

3 стола:

SELECT Item.*
  FROM Item
  JOIN ItemTag ON Item.ItemID = ItemTag.ItemID
  JOIN Tag ON ItemTag.TagID = Tag.TagID
 WHERE Tag.Title = :title

2 стола:

SELECT Item.*
  FROM Item
  JOIN Tag ON Item.ItemID = Tag.ItemID
 WHERE Tag.Title = :title

Но schema-design есть и некоторые недостатки: это tags может занять больше места sql-select в базе данных (что может database-modeling привести к большему количеству sql операций с диском, которые data-modeling будут медленнее), и он не sql-query нормализован, что может привести data-modelling к несоответствиям.

Аргумент sql-query размера не так уж силен, потому data-modeling что сама природа тегов такова, что tags они обычно довольно малы, поэтому sqlselect увеличение размера не является sql-query большим. Можно утверждать, что tags запрос заголовка тега выполняется data-modelling намного быстрее в небольшой tag таблице, которая содержит database-design каждый тег только один раз, и table-design это, безусловно, правда. Но sql-query с учетом экономии за счет tagging отсутствия присоединения tagging и того факта, что вы можете tags построить на их основе хороший database-design индекс, можно легко это компенсировать. Это, конечно, сильно sqlselect зависит от размера используемой sql базы данных.

Аргумент о непоследовательности sql-query тоже немного спорен. Теги tag - это поля с произвольным database-design текстом, и здесь не требуется database-design операции типа «переименовать sql-select все теги с« foo »в« bar »».

Итак, tldr: я sqlselect бы выбрал решение с двумя tags столами. (На самом деле я tag собираюсь это сделать. Я tagging нашел эту статью, чтобы узнать, есть tagging ли веские аргументы против sql-query нее.)

sql

database-design

tags

data-modeling

tagging

2022-10-31T12:12:49+00:00
Вопросы с похожей тематикой, как у вопроса:

Рекомендуемый дизайн базы данных SQL для тегов или тегов