实体属性值
它被称为实体属性值(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.