admin

为什么Wordpress有单独的“ usersmeta”和“ users” SQL表。为什么不将它们结合起来?

sql

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

  • meta_id
  • user_id
  • meta_key(例如first_name)
  • meta_value(例如Tom)

每个用户在usersmeta表中都有20行,无论这些行是否具有填充的meta_value。就是说,将始终存在的元行添加到users表是否会更有效?

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


阅读 191

收藏
2021-06-07

共1个答案

admin

实体属性值

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

为什么使用它

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

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

备择方案

使用EAV的替代方法包括:

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

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

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

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

进一步的WP信息

如果您不使用任何/许多插件,则可能在每个用户的usermeta表中有恒定数量的行,但是通常,您添加的每个插件可能都需要为用户添加元数据。添加的数字可能并不容易,并且此数据存储在usermeta表中。

add_meta_user的文档可能会更清楚地说明为什么以这种方式构造数据库。如果将这样的代码放在某处:

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

它将在usermeta表中为给定的user_id创建一行,而无需在主用户表中添加一列(favorite_color)。这使得通过喜好的颜色轻松查找用户而无需修改users表的架构。

2021-06-07