有了网站,用户可以张贴一篇文章,最多10个标签,我搜索了一下如何设计数据库:都是多对多的关系。
但我发现使用&或其他工具添加文章标签要容易得多……像这样:c#&c++&c&db&syntax。
它会在查询或其他方面有所不同吗?
发布于 2018-12-22 15:18:54
习惯多对多关系
他们不会伤害你(太多;)
,但是我发现添加文章标签要容易得多。
唯一的“优势”不是习惯新的东西(而是好的东西)。
为文章添加标签:
分隔字段:
UPDATE Articels SET Tags = CONCAT(Tags, '&', NewTag) WHERE Article.Id = 123;m:n (多对多):
INSERT INTO ArticlesTags (ArticleId,TagId) Values (123,NewTagId);对我来说,m:n甚至比分隔的还要短。
现在尝试对分隔字段进行排序,删除一个标签或计算每个标签的文章数。如何防止一个标签被多次分配给一个artikel?这需要用delimited检查。使用m:n时,只需在文章‘t/标记’t上创建一个多列唯一索引,数据库就不允许插入两次ArticleId,TagId组合。
另一个影响是,您(几乎)不能在分隔字段上使用索引,因为您需要过滤某些内容。喜欢
WHERE Tag LIKE '%TagToFilter%'但是您可以使用只能以字段中的第一个字符开头的索引,例如:
WHERE Tag LIKE 'TagToFilter%' OR Tag LIKE 'TagToFilter'唯一更复杂的是显示所有的文章标签。
分隔符:
SELECT Tags FROM Articles;m:n
SELECT
Articles.Id
, GROUP_CONCAT(Tags.Tag) AS ConcatTags
FROM
Articles
LEFT JOIN
ArticlesTags
ON
Articles.Id = ArticlesTags.ArticlesId
INNER JOIN
Tags
ON
ArticlesTags.TagId = Tags.Id
GROUP BY
Articles.Id您的方法中的另一个缺陷是,您存储标记字符串而不是它们的主键。如果您更改标签(例如,将c-sharp更改为c#),则会导致许多更新。其中PK存储为外键。标记上的一次更新会将其更改到所有位置。
https://stackoverflow.com/questions/53893179
复制相似问题