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

2024-03-10

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

  • meta_id
  • user_id
  • 元键(例如名字)
  • 元值(例如汤姆)

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

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


实体属性值

它被称为实体属性值 http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model(EAV) 数据模型,并允许将任意数量的属性分配给给定实体。这意味着每个用户可以有任意数量的元数据条目。

为什么使用它

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

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

备择方案

使用 EAV 的替代方案包括:

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

权限是第一点的最大问题,授予全面访问权限来更改数据库表的架构并不是一个好主意,并且对于许多(如果不是大多数)wordpress 安装(托管在 wordpress.com 或在 db 用户没有更改权限的共享主机上)。 Mysql也有一个硬限制4096 列和每行 65,535 字节 http://dev.mysql.com/doc/refman/5.6/en/column-count-limit.html。尝试在单个表中存储大量列最终会失败,并在此过程中创建一个查询效率低下的表。

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

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

更多 WP 信息

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

的文档添加元用户 http://codex.wordpress.org/Function_Reference/add_user_meta可能会更清楚地说明为什么数据库是这样构造的。如果你把这样的代码放在某处:

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

它将在 usermeta 表中为给定的 user_id 创建一行,而不需要向主用户表添加列 (favorite_color)。这使得通过最喜欢的颜色查找用户变得很容易,而无需修改用户表的架构。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Wordpress 有单独的“usersmeta”和“users”SQL 表。为什么不把它们结合起来呢? 的相关文章

  • 以编程方式插入行(父行和子行)

    我正在使用 Spring 和 JDBCTemplate 该场景是 CUSTOMER 表和 ORDERS 表的父子关系 我想做一个插入 例如 1 个客户和 5 个订单 但我不确定如何以编程方式在 CUSTOMER 表中插入一行 如何获取 Or
  • 如何在 WordPress 中按类别获取所有帖子

    我想在 WordPress 中按类别获取帖子 args array post type gt project postslist get posts args 0 gt WP Post 对象 ID gt 421 post author gt
  • 使用联接更新表?

    我正在尝试使用表 B 中的数据更新表 A 我以为我可以做这样的事情 update A set A DISCOUNT 3 from INVOICE ITEMS A join ITEM PRICE QUNTITY B on A ITEM PRI
  • H2 SQL 日期比较

    在 H2 数据库中 如何在 TIMESTAMP 类型的列上运行查询 SELECT FROM RECORDS WHERE TRAN DATE lt 2012 07 24 Try 2012 07 24
  • Java、Oracle 中索引处缺少 IN 或 OUT 参数:: 1 错误

    您好 我使用 Netbeans 8 0 2 和 Oracle 11g Express Edition 在 JSF 2 2 中编写了一个图书馆管理系统 我有几个名为 书籍 借阅者 等的页面 以及数据库中一些名为相同名称的表 我的问题是这样的
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • 获取mysql中逗号分隔行中不同值的计数

    一个表 Jobs 有 2 列 JobId 城市 当我们保存工作时 工作位置可能是多个城市 如下所示 JobId City 1 New York 2 New York Ohio Virginia 3 New York Virginia 我如何
  • 在Oracle中使用IW和MM

    我使用 IW 表示每周结果 使用 MM 表示每月结果 但我总是收到错误 ORA 00979 not a GROUP BY expression 00979 00000 not a GROUP BY expression 我的疑问是这些 We
  • meta_query,如何使用关系 OR 和 AND 进行搜索?

    已解决 请参阅下面的答案 我有一个名为的自定义帖子类型BOOKS 它有几个自定义字段 名称为 TITLE AUTHOR GENRE RATING 我该如何修复我的meta query下面的代码以便仅books在自定义字段中包含搜索词 tit
  • 没有提示指令的直连接中表的顺序是否会影响性能?

    所有基于 SQL 的 RDBMS 10 年前的版本 直接连接查询 没有提示指令 中的表顺序是否会对最佳性能和内存管理产生影响 听说最后一个join应该是最大的表 您的数据库的查询优化器如何处理这种情况 回答你的问题 是的 表的顺序在连接中有
  • 自定义帖子类型的 WordPress 自定义字段

    过去有几个人出现过这个问题 但他们的问题的解决方案对我来说不起作用 我已经尝试了很多 在 WordPress 中 我创建了 3 种自定义帖子类型 1 代表 视频 新闻 和 音乐 每个内容都发布到自己的页面 我想添加自定义字段 这样我就可以为
  • 如果 Oracle SQL 中存在视图,则删除视图[重复]

    这个问题在这里已经有答案了 我是 Oracle 数据库系统的新手 Oracle 12c 中以下 SQL 语句的等效项是什么 DROP VIEW IF EXIST
  • ALTER TABLE 语句与 FOREIGN KEY 约束冲突

    为什么要添加外键tblDomare表导致此错误 ALTER TABLE 语句与 FOREIGN KEY 约束 FK tblDomare PersN 5F7E2DAC 冲突 冲突发生在数据库 almu0004 表 dbo tblBana 列
  • pymssql 库中的参数绑定是否正确实现?

    我使用 pymsqsql 库从 Python 程序调用极其简单的查询 with self conn cursor as cursor cursor execute select extra id from mytable where id
  • Ruby ActiveRecord 和 sql 元组支持

    ActiveRecord 是否支持 where 子句中的元组 假设底层数据库支持 结果 where 子句看起来像这样 where name address in John 123 Main St I tried Person where n
  • 如何使用一个命令删除 SQL 数据库中的所有索引?

    那么 如何通过一条命令删除 SQL 数据库中的所有索引呢 我有这个命令可以获取所有 20 个左右的 drop 语句 但是如何从这个 结果集 运行所有这些 drop 语句呢 select from vw drop idnex 给我相同列表的另
  • 需要在 SQL Server 中透视字符串值

    我有一个包含值的表 描述为 Occupation String Name String Developer A Developer B Designer X Coder Y Coder Z 我需要数据透视格式的值 Designer Deve
  • 禁用 WooCommerce 手动/编辑订单的电子邮件通知

    需要 WooCommerce 专业知识 我需要禁用手动创建的订单的电子邮件通知 我必须使用处理状态 由于处理订单状态的自定义挂钩 我无法创建自定义状态 理想情况下 手动订单页面中可以勾选一个复选框 勾选后 它将禁止在每种状态下向客户发送电子
  • 总和和不同不会改变结果?

    我是一个新手 试图在这里解决这个问题 到目前为止还没有运气 非常感谢任何帮助 Select Distinct AB agency no ab branch no AS AGENCY BRANCH count AB agency no ab
  • 多边形内的 SQL 地理点在 STIntersect 上不返回 true(但使用 Geometry 返回 true)

    我不想仅仅为了在 STIntersect 中返回 true 而将地理数据转换为几何图形 下面是 SQL 中的代码 DECLARE point GEOGRAPHY GEOGRAPHY Point 1 1 4326 DECLARE polygo

随机推荐