WordPress的可拓展性--数据库

在原版WordPress中,每一篇文章有哪些元信息(meta-data)是已经定好了的,例如一篇文章会有“作者”、“标题”、“发布时间”、“文章内容”等。这些元信息会直接体现在数据表的结构(schema)上。例如,存放文章的表中,就会有诸如“post_author”、“post_title”、“post_date”、“post_content”等列。

但是作为插件来说,我们不可避免地要为文章添加元信息。例如发布优惠券的插件需要记录优惠码、需要记录过期时间,地图插件需要记录经纬度坐标等等。元信息是灵活的,可是数据表的结构一旦定下就很难修改。那么我们怎样做才可以实现灵活的数据表结构呢?

我们可以尝试使用行列转换的思路,把原来表中的行转换成列,把原来表中的列转换成行。

在WordPress中有一个表专门用于存储文章的元信息,名称叫做 wp_postmeta 。它只有四列,分别为 meta_id 、 post_id 、 meta_key 、 meta_value 。其中 meta_id 只是一行记录唯一的ID, post_id 表示该记录属于哪一篇文章, meta_key 为元信息的名称, meta_value 为元信息的值。

下面我们用记录地理位置信息中的经纬度举一个例子。我们需要给文章存储 latitude 和 longitude 这两个信息,首先我们需要知道,我们文章的 post_id 是多少,这是可以从 wp_posts 数据表中获取的。接下来,我们要向 wp_postmeta 中添加两条记录,分别存储精度和纬度。下面以添加纬度为例(添加经度的方法类似):

INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (<实际的文章ID>, "latitude", <实际的纬度>);

我们可以从中发现,我们并没有对数据表的结构进行任何改动,而只是向一个表中添加了信息,就达成了扩展元信息类型的目的。

需要读取元信息的思路也很简单,只要通过 post_id 在 wp_postmeta 中找到相应的记录,并且再次根据 meta_key 进行筛选就可以了。下面举例获取纬度:

SELECT meta_value FROM wp_postmeta WHERE post_id=<实际的文章ID> and meta_key="latitude";

如果要同时获取多个信息,这样写比较紧凑:

SELECT MAX(CASE WHEN pm.meta_key='latitude' THEN pm.meta_value END) AS latitude, MAX(CASE WHEN pm.meta_key='longitude' THEN pm.meta_value END) AS longitude FROM wp_posts as p, wp_postmeta as pm WHERE p.ID=pm.post_id AND p.ID=<实际的文章ID> GROUP BY p.ID;

虽然这样的设计可以极大地提高数据库的可拓展性,但是同样它也带来了一些问题:

首当其冲的是效率问题,因为这样在存储一篇文章时,就不可避免地要向两个表中添加信息,查询时也要牵扯到两个表的结合,会拖慢数据库的执行效率。

其次是类型检查,一般情况下,表中每一列都有其数据类型,在向表中插入数据时,SQL会依据数据类型对其进行检查,如果采用上面的方式,那么 meta_value 只能为字符串类型,这样从某种程度降低了数据的可靠程度。

最后是数据库结构检查,一般情况下,我们可以利用 NOT NULL 来规定某一列必须有一个值,而使用上面提到的方式,就必须由Web应用程序来进行这样的检查了。

综上所述,利用这样的方式,我们确实可以提高数据库的可拓展性,但是可拓展性也不可避免地带来一些小问题。所以我们需要根据工程的具体需求,灵活地应用这种方式。

转载于:https://my.oschina.net/snowing1990/blog/635539

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值