2

除了 users 表,Wordpress 还有一个 usersmeta 表,其中包含以下列

  • meta_id
  • 用户身份
  • meta_key(例如 first_name)
  • 元值(例如汤姆)

每个用户在 usersmeta 表中有 20 行,不管这些行是否有填充的 meta_value。也就是说,将始终存在的元行添加到 users 表不是更有效吗?

我猜测 users 表中的信息被查询得更频繁(例如 user_id、username、pass),因此保持这些行更小更有效。这是真的?这种表格分离还有其他原因吗?

4

2 回答 2

5

实体属性值

它被称为实体属性值(EAV) 数据模型,允许将任意数量的属性分配给给定实体。这意味着每个用户有任意数量的元数据条目。

为什么使用它

默认情况下,wordpress 设置了几个键(问题中说明了 20 个),但可以有任意数量。如果所有用户都有一千个元数据条目 - 每个用户的 usermeta 表中只有一千个条目 - 它没有(就数据库结构而言)用户可以拥有的元数据条目数量的限制. 它还允许一个用户拥有一千个元数据整体,而所有其他用户拥有 20 个并且仍然有效地存储数据 - 或其任何排列。

除了灵活性之外,使用这种结构还允许主用户表保持较小 - 这意味着更有效的查询。

备择方案

使用 EAV 的替代方法包括:

  • 每当属性数量发生变化时修改架构
  • 将所有属性存储在序列化字符串中(在用户对象上)
  • 使用无模式数据库

权限是第一点的最大问题,授予全面访问权限以更改数据库表的架构并不是一个好主意,并且对于许多(如果不是大多数)wordpress 安装(托管在 wordpress.com 或在 db 用户没有更改权限的共享主机上)。Mysql 也有4096 列和每行 65,535 字节的硬限制。尝试在单个表中存储大量列最终将失败,同时创建查询效率低下的表。

将所有属性存储在序列化字符串中会使通过元数据值查询变得困难且缓慢。

Wordpress 与 mysql 密切相关,因此更改数据存储不是一个现实的选择。

更多 WP 信息

If you aren't using any/many plugins it's possible you will have a constant number of rows in the usermeta table for each user, but typically each plugin you add may need to add meta-data for users; the number added may not be trivial and this data is stored in the usermeta table.

The docs for add_meta_user may add some clarity as to why the database is structured that way. If you put code like this somewhere:

add_user_meta($user_id, "favorite_color", "blue");

It will create a row in the usermeta table for the given user_id, without the need to add a column (favorite_color) to the main users table. That makes it easy-ish to find users by favorite color without the need to modify the schema of the users table.

于 2012-06-14T15:03:18.457 回答
2

这确实是一个关于数据库规范化的问题。您可以在许多地方查找有关该主题的信息。

基本答案由于有大量关于此的文献,并且存在很多差异,因此我将仅举一些示例说明为什么会发生这种情况-归结为权衡取舍;速度与存储要求,或易用性与数据复制。效率是多维的,由于 wordpress 做了很多不同的事情,可能有各种原因将它们分开 - 空间可能是一个问题,查询速度可能取决于此,可能更容易只查看元表而不是出于某些目的使用整个表格,反之亦然。

进一步阅读这是一个很深的话题,你可能想了解更多——关于这些问题有数百本书和数千篇学术论文。例如,看看之前关于设计数据库的 SO 问题: 数据库设计:一个巨大的表还是单独的表?,或者这个:第一次数据库设计:我是否过度设计? 或About.com 上的数据库规范化基础知识 。

于 2012-06-14T14:42:57.960 回答