【问题标题】:Integer vs char for DB record property vs Wordpress schema数据库记录属性与 Wordpress 模式的整数与字符
【发布时间】:2011-01-05 18:14:30
【问题描述】:

我之前曾问过一个类似的问题 (integer-vs-char-for-db-record-property),但偶然发现了一些与我在上一篇文章中收到的所有建议背道而驰的问题。在最流行和最成熟的开源博客脚本 Wordpress 3 中,帖子状态在 db - 'publish'、'auto-draft'、'inherit'、'pending'等中存储为VARCHAR(20),而不是@987654323 @ 带有查找表或映射的字符串常量,或CHAR,或类似的东西。这也适用于字段post_type('post'、'attachment'、'revision'等)和其他一些字段。 因此,要查找所有已发布的帖子,我需要运行 SELECT * FROM posts WHERE post_status = 'published' AND post_type = 'post' 之类的内容。此外,post_status、post_type 和其他一些列上有一个多列索引,这肯定会加速这种搜索。有人能解释一下为什么他们采用这种方式而不是另一种方式吗?这种方法的优点和缺点是什么?

【问题讨论】:

    标签: sql mysql database wordpress database-design


    【解决方案1】:

    仅仅因为某些应用程序众所周知并不意味着它们具有良好的数据库设计。这往往违反规范化规则。也许他们获得了更好的性能,也许他们在选择这个时没有考虑其他可能性,因为他们不知道更好。也许他们是设计数据库的应用程序程序员,而没有很好地理解数据库理论,或者可能是故意去规范化并使用性能统计数据来支持它。或者,当我们决定将值从“已发布”更改为其他值时,他们可能没有想到必须更新 1 亿条记录的可能性。也许他们只测试了选择的性能,而不是更新的性能。也许这些值不太可能改变,所以非规范化并不是什么大不了的事。我们不能从这里知道。

    【讨论】:

    • 将 status 和 post_type 存储为字符串不可能“违反规范化规则”(据我所知,甚至“倾向于”违反它们)。文森特描述的设计可能会使数据库比它需要的大得多,但这是一个不同的问题。规范化与存储在列中的数据类型完全无关,与存储大小无关。我认为这应该很清楚。
    【解决方案2】:

    规范化不是仅仅因为它们具有相同的字母而用数字替换字符串或“共享”字符串。

    我不知道他们的设计,但是下面的场景是完全规范化的,即使它使用字符串作为标识符。

    create table post_statuses(
       status varchar(20) not null
      ,primary key(status)
    );
    
    insert into post_statuses values('publish');
    insert into post_statuses values('inherit');
    insert into post_statuses values('pending');
    
    create table posts(
       post_id ...
       status varchar(20) not null
      ,primary key(post_id)
      ,foreign key(status) references post_statuses(status)
    );
    

    使用自然键而不是代理键的主要好处是,它减少了所需的连接数量,以及整个查询类只能从索引中回答的可能性。主要缺点是增加了存储空间,如果我们需要更改值,可能会遇到麻烦。

    【讨论】:

      【解决方案3】:

      我猜 WP 开发人员只是避免了他们认为过早的优化,而是选择了更好的可读性。

      "SELECT * FROM posts WHERE post_status = 'published' AND post_type = 'post'"
      

      比阅读更容易一点

      "SELECT * FROM posts WHERE post_status = ".WP_POST_STATUS_PUBLISHED."
          AND post_type = ".WP_POST_TYPE_POST.""
      

      当新的 WP 开发者运行 select * from ... 查询时,数据库表会列出“已发布”而不是 3 或 5,这样更易​​于理解和调试。

      从磁盘存储空间的角度来看,我认为这两种方法都还不错 — 与博客文章文本和所有其他列相比,多一些 post_status 字节应该没有多大关系 .一个整数是 8 个字节(除非它是一个 tinyint),而“已发布”可能是 10 个字节,所以没关系?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多