【问题标题】:Three-Dimensional (or more) Tagging System? PHP / MySQL Database Architecture三维(或更多)标记系统? PHP / MySQL 数据库架构
【发布时间】:2013-04-19 08:54:07
【问题描述】:

很明显,我出来是带着一个头脑风暴的问题。那,或者我太菜鸟了,看不到任何明显的答案:

如何实现一个标签系统,其中每个标签与网站的每个用户都有特定的关系?

我试图实现的一个非常简单的例子是系统跟踪用户为每个标签所做的页面点击。例如,多个标签关键字被“标记”到网站的每个页面。关于环境科学的页面可能会被标记为“生物学”和“社会学”等关键字。当用户 A 访问该页面时,用户 A 每次查看“生物学”时都会将一个数字加 1,然后再计算“社会学”。

因此,我们最终得到了显示一个人喜欢特定标签的程度的记录。

使用 MySQL 执行此操作的最有效方法是什么?是否可以将其用于如下所示的两表系统?

Table 1: Tags

 - tag_title
 - tagged_pages
 - user_likes

Table 2: Users

 - user_id

添加更多的表格列是完全可以的。我要避免的是复制标签表和其中的所有记录。

到目前为止,我想出的只是将每个标签的user_likes 字段格式化为:101-12, 99-3, 156-14...等。然后使用 PHP explode() 将 user_id 与点赞数分开。

非常感谢您的创造性见解!

【问题讨论】:

    标签: php mysql database-design tagging


    【解决方案1】:

    永远不要在一个列中放置多个信息。这是规范化的第一条规则,你真的不应该打破它。

    我认为您需要更多表来正确构建它(并正确规范化)

    users
        id
        name
    
    tags
        id
        name
    
    pages
        id
    
    page_tags
        page_id
        tag_id
    
    user_page_hits
        user_id
        page_id
        hits
    

    现在,如果您想知道用户喜欢某个标签的程度,您可以在这些表上创建一个视图,例如

    user_tag_hits
        as select u.name, t.name, sum(uph.hits) hits from users u
                  join user_page_hits uph on uph.user_id = u.id
                  join page_tags pt on pt.page_id = uph.page_id
                  join tags t on t.id = pt.tag_id
                  group by u.name, t.name
    

    这会产生类似的结果

    username tagname  hits
    me  tag1    112
    me  tag2    112
    me  tag3    70
    me  tag4    4
    me  tag5    4
    

    【讨论】:

    • 但这不会在 page_tags 表中创建指数级的大量记录吗?标签和表格都会有很多重复。它会变得更大更复杂,能够在用户和标签之间建立更复杂的关系,而不仅仅是页面点击。我知道一个单元格中不应该有多个信息,但是没有更好的方法吗? “三维”?
    • 数据库是制造出来的,因此它们可以在表中保存数以百万计的数据,并且它们之间具有多维关系链接。这正是您使用这些工具的目的。我的意思是,即使您谈论的是十亿个条目,它们中的每一个都非常小。两个整数,即 64 位空间。十亿倍,你会得到大约 7 TiB 的数据,这在现在真的不是那么多。通过适当的索引,您在查询 100 个条目和 1.000.000 个条目时可能不会感觉到速度上有任何差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2011-01-22
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多