DB记录属性与Wordpress架构的整数与字符串

时间:2011-01-05 18:14:31

标签: sql mysql database wordpress database-design

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

3 个答案:

答案 0 :(得分:1)

仅仅因为某些应用程序众所周知并不意味着它们具有良好的数据库设计。这往往违反了规范化规则。也许他们获得了更好的表现,也许他们在选择这一个时并没有看到其他可能性,因为他们没有做得更好。也许他们是aplication程序员设计一个数据库而不是很好地理解数据库理论,或者可能是故意的denormailzation与性能统计数据来支持它。或者当我们决定将值从“已发布”更改为其他内容时,他们可能不会想到更新1亿条记录的可能性。也许他们只测试了选择的性能而不是更新。也许这些价值通常是变化无法实现的,所以反规范化并不是什么大问题。我们不能从这里知道。

答案 1 :(得分:1)

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

我不知道他们的设计,但即使使用字符串作为标识符,以下场景也完全正常化。

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)
);

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

答案 2 :(得分:0)

我猜想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个字节(除非它是一个小字节)并且已经发布了#39;可能是10个字节,所以不重要吗?