【问题标题】:how to save tags(keywords) in database?如何在数据库中保存标签(关键字)?
【发布时间】:2011-05-28 20:33:36
【问题描述】:

我想用php和mysql创建一个简单的标签系统,以便用户可以通过表单添加一些标签。我的问题是我应该将标签保存为单个数据库列中的数组吗?例如。 “tag1,tag2,tag3”.. 或者我应该在数据库表中有单独的列,我应该在每列中保存每个标签。 我希望我的问题很清楚。 谢谢。

【问题讨论】:

    标签: mysql tags


    【解决方案1】:

    我可能都不会说。在标记和被标记的对象之间使用多对多关系。例如,如果被标记的事物是一个问题,那么表格可能如下所示:

    Question:
        QuestionId
        Title
        Body
    
    Tag:
        TagId
        Name
    
    QuestionTags:
        QuestionId
        TagId
    

    【讨论】:

    • 这种方式提供了可扩展性并允许使用索引优化数据库。很好的答案。
    • 我登陆了这个页面,寻找在这种方案中更新标签列表的建议。你会怎么做? DELETE FROM QuestionTags WHERE QuestionId = 123 然后插入到 QuestionTags 所有剩余的和新的标签?这对开发人员来说似乎是最简单的,但对于性能来说可能不是最好的......
    • @Henno 我不确定我理解你的意思。你能问一个单独的问题吗?
    【解决方案2】:

    您可以使用序列化和反序列化将关键字存储在一个字段中。更多信息在这里 http://php.net/manual/en/function.serialize.php

    这样的……

    $keywords = array('apple', 'pear', 'banana', 'peach');
    $keywords_serialized = serialize($keywords);
    $sql = INSERT INTO dbtable (keywords) VALUES ($keywords_serialized);
    

    【讨论】:

    • 将序列化的字符串存储在数据库中应该是一件非常罕见的事情。
    • 膨胀任何数据库的好方法。
    【解决方案3】:

    今天也遇到了这个问题,在这里收集了一些想法,虽然这个问题不是很新,但我也会留下我的解决方案:

    我认为 Klaus Byskov Hoffmann 给出的答案还不错,但我会添加它并将标签列表存储为他所说的多对多表,但也可以作为某种形式的序列化字符串(或者通过 user466764 说的序列化,或者像你自己说的那样只是一个逗号分隔的东西,可以在主表中使用 implode/explode 来处理。

    是的,我知道:许多数据库完美主义者不太喜欢将相同的数据存储两次,因为它存在出现不一致的危险,但为了性能和简单性,我会这样做:

    多对多表(标签表)仅用于搜索。为了提高搜索性能,我会限制对该表的访问仅限于搜索(当然我们需要在编辑标签时更新它),但永远不要仅仅为了查看/列出某处的标签而查询它。并且序列化标签列表适用于您正在查看相关文章或项目的每个地方 - 显示该项目时,您已经拥有该表,每次您想要显示该页面时都会对标签表进行另一个查询当您已经在主表中有列表时,这是不必要的。确保在更新标签时要小心,以始终在两个地方更新它们,最好通过一个同时执行这两个操作的 setter 函数,并且您不应该遇到不一致的问题。

    【讨论】:

    • 完全同意。页面加载时间优化应该与数据库规范化一样重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多