Normalement je suis d'accord avec Yaakov Ellis, mais dans ce cas spécial, il y a une autre solution viable:
L'utilisation de deux tables:
Table: Item
Columns: ItemID, Title, Content
Indexes: ItemID
Table: Tag
Columns: ItemID, Title
Indexes: ItemId, Title
Cela a quelques avantages majeurs:
D'abord, il rend le développement plus simple: dans les trois tables solution pour l'insertion et la mise à jour de item
que vous avez à la recherche de l' Tag
tableau pour voir si il y a déjà entrées. Ensuite, vous avez à se joindre à eux avec de nouveaux. Ce n'est pas une tâche triviale.
Alors il fait des requêtes plus simple (et peut-être plus rapide). Il existe trois principales requêtes de base de données qui vous permettra de faire: Sortie tous Tags
pour un Item
, dessiner un Tag-Cloud et de sélectionner tous les éléments pour une Balise de Titre.
Toutes les Balises d'un Article:
3-Tableau:
SELECT Tag.Title
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
WHERE ItemTag.ItemID = :id
2-Tableau:
SELECT Tag.Title
FROM Tag
WHERE Tag.ItemID = :id
Tag-Cloud:
3-Tableau:
SELECT Tag.Title, count(*)
FROM Tag
JOIN ItemTag ON Tag.TagID = ItemTag.TagID
GROUP BY Tag.Title
2-Tableau:
SELECT Tag.Title, count(*)
FROM Tag
GROUP BY Tag.Title
Éléments pour une Balise:
3-Tableau:
SELECT Item.*
FROM Item
JOIN ItemTag ON Item.ItemID = ItemTag.ItemID
JOIN Tag ON ItemTag.TagID = Tag.TagID
WHERE Tag.Title = :title
2-Tableau:
SELECT Item.*
FROM Item
JOIN Tag ON Item.ItemID = Tag.ItemID
WHERE Tag.Title = :title
Mais il y a quelques inconvénients: Il pourrait prendre plus d'espace dans la base de données (ce qui pourrait conduire à plus d'opérations sur le disque dur qui est plus lent) et il n'est pas normalisée qui pourrait conduire à des incohérences.
La taille de l'argument n'est pas forte parce que la nature de balises, c'est qu'ils sont normalement assez petit, de sorte que l'augmentation de la taille n'est pas un grand. On pourrait faire valoir que la requête pour la balise de titre est beaucoup plus rapide dans un petit tableau qui contient chaque balise qu'une seule fois et ce n'est certainement vrai. Mais à prendre en ce qui concerne les économies pour ne pas avoir à se joindre et le fait que vous pouvez construire un indice sur eux pourrait facilement compenser pour cela. Bien sûr, cela dépend fortement de la taille de la base de données que vous utilisez.
L'incohérence de l'argument est un peu discutable. Les balises sont des champs de texte libre et il n'est pas prévu de l'opération comme " renommer toutes les balises "foo", "bar"'.
Donc tldr: je pencherais pour les deux tables de la solution. (En fait, je vais le faire. J'ai trouvé cet article pour voir si il y a des arguments valables contre elle.)