首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文章标签应为多对多或带分隔符的列

文章标签应为多对多或带分隔符的列
EN

Stack Overflow用户
提问于 2018-12-22 13:01:29
回答 1查看 139关注 0票数 0

有了网站,用户可以张贴一篇文章,最多10个标签,我搜索了一下如何设计数据库:都是多对多的关系。

但我发现使用&或其他工具添加文章标签要容易得多……像这样:c#&c++&c&db&syntax

它会在查询或其他方面有所不同吗?

EN

回答 1

Stack Overflow用户

发布于 2018-12-22 15:18:54

习惯多对多关系

他们不会伤害你(太多;)

,但是我发现添加文章标签要容易得多。

唯一的“优势”不是习惯新的东西(而是好的东西)。

为文章添加标签:

分隔字段:

代码语言:javascript
复制
UPDATE Articels SET Tags = CONCAT(Tags, '&', NewTag) WHERE Article.Id  = 123;

m:n (多对多):

代码语言:javascript
复制
INSERT INTO ArticlesTags (ArticleId,TagId) Values (123,NewTagId);

对我来说,m:n甚至比分隔的还要短。

现在尝试对分隔字段进行排序,删除一个标签或计算每个标签的文章数。如何防止一个标签被多次分配给一个artikel?这需要用delimited检查。使用m:n时,只需在文章‘t/标记’t上创建一个多列唯一索引,数据库就不允许插入两次ArticleId,TagId组合。

另一个影响是,您(几乎)不能在分隔字段上使用索引,因为您需要过滤某些内容。喜欢

代码语言:javascript
复制
WHERE Tag LIKE '%TagToFilter%'

但是您可以使用只能以字段中的第一个字符开头的索引,例如:

代码语言:javascript
复制
WHERE Tag LIKE 'TagToFilter%' OR Tag LIKE 'TagToFilter'

唯一更复杂的是显示所有的文章标签。

分隔符:

代码语言:javascript
复制
SELECT Tags FROM Articles;

m:n

代码语言:javascript
复制
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存储为外键。标记上的一次更新会将其更改到所有位置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53893179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档