文档章节

WordPress的可拓展性--数据库

snowing1990
 snowing1990
发布于 2016/03/11 16:22
字数 942
阅读 14
收藏 2
点赞 1
评论 0

在原版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应用程序来进行这样的检查了。

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

本文转载自:

共有 人打赏支持
snowing1990
粉丝 4
博文 90
码字总数 2952
作品 0
程序员
Centos 6.9中PHPmyadmin 的搭建,WordPress的搭建,Discuz的搭建

首先呢,在Centos 6.9中需要一些准备环境,我是在我上一篇博客的基础上进行搭建的;再次基础上进行拓展搭建; httpd mysql-server php php-mysql 这四个rpm包,直接用yum装上,这个操作我就不...

刘景宇
05/04
0
0
LNMMP架构搭建wp个人博客实现动静态内容分离

思路: 搭建wordpress个人博客,nginx做动静态文件分离,nginx处理静态内容(本地) 动态内容由上游服务器php-fpm来完成 规划: nginx 反代后端 php-fpm 172.16.43.1 php-fpm,php-extentsion(memca...

My_King1
2014/04/26
0
0
WordPress的网友评论

WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL 数据库的服务器上架设自己的网志。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开...

红薯
2009/12/11
277
3
博客平台--WordPress

WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL 数据库的服务器上架设自己的网志。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开...

匿名
2008/09/06
92.9K
8
WordPress.com 已升级到 PHP7,性能显著提升

据了解,目前 WordPress.com 已经全部升级到 PHP 7,性能显著提升。 如下所示,CPU、latency(延迟)有了大幅度的提升与改进。 WordPress是一种使用 PHP 语言开发的博客平台,用户可以在支持...

凝小紫
2016/12/09
7.4K
28
WordPress 4.2 Beta 3 发布,PHP 博客系统

WordPress 4.2 Beta 3 发布,可以尝试 WordPress Beta Tester 插件,或者直接下载 Beta 版本 (zip)。 Beta 3 主要改进如下: 移除了 Shiny Installs 函数 修复了一个关于 Comments Quick Edi...

oschina
2015/03/28
1K
4
Windows Azure真实案例:NeoGeo New Media --SQL Azure提高数字媒体资产解决方案的拓展性

公告 :本博客为微软云计算中文博客 的镜像博客。 部分文章因为博客兼容性问题 ,会影响阅读体验 。如遇此情况,请访问 原博客 。 NeoGeo New Media 在一个持续制造着图像,视频和其他数字内...

晨曦之光
2012/03/09
0
0
开发者都应该知道的开源搜索引擎

本文介绍若干款开源搜索引擎,他们具有不同的特性,总之都很强大。对于开发者来说,应该了解。 1、企业搜索解决方案 Constellio Constellio 是一个开源的搜索解决方案,适合企业级的搜索。基...

老枪
2011/06/01
2.9K
7
Wordpress与Discuz

httpd访问的资源有两种,静态资源以及动态资源;静态资源有我们常见的图片,jsp,音乐,音频等,而动态资源指的是一些需要经过编译执行代码来实现的资源类型,需要数据库MySQL或MariaDB来辅助...

wujunqi1996
06/28
0
0
小型电商服务器平台搭建(一)

一、阿里云小型电商服务平台架构介绍 电商平台初创之初,访问量不大,但将来可能访问量暴增,初期阶段业务模式调整频繁,对价格敏感,因此希望服务器平台架构具有良好的功能拓展性及性能伸缩...

newthink
2017/05/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Git GUI Client

Git GUI Client

qwfys
5分钟前
0
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
9分钟前
2
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
15分钟前
1
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
30分钟前
1
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 #!/usr/bin/expectset passwd "123456"spawn rsync -av root@192.168.133.132:/tmp/12.txt /tmp/expect {"yes...

lyy549745
30分钟前
0
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
38分钟前
0
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
43分钟前
1
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
0
0
nginx负载均衡

一、nginx 负载均衡 拓扑图: 主机信息: 1、负载均衡器1(lb1):192.168.10.205 RHEL7.5 2、负载均衡器2(lb2):192.168.10.206 RHEL7.5 3、web服务器1(web01):192.168.10.207 Centos...

人在艹木中
昨天
0
0
做了一个小网站

做了一个小网站 www.kanxs123.com

叶落花开
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部