【发布时间】:2023-04-02 05:58:01
【问题描述】:
对不起,如果我发错地方了,我是法国人(对不起,我修改了谷歌翻译),通常我仍然可以管理,但我在这个问题上咬牙切齿。
我正在使用 WordPress、MySQL 和一个名为 WP-member 的成员管理插件。我修改了插件,使用户能够输入他的邮政编码。
问题在于,使用 WordPress,所有有关用户的信息都存储在 usermeta 表中。
这是表的结构:
umeta_id(pk):不是用户id而是注册id,可以是用户名、邮编等。多个umeta_id可以与用户id关联。
user_id(fk): 是用户的id,在另一个表中是pk但是另一个表不能存储我想要的数据,因为该表在WordPress下是不可修改的。
meta_key:是数据的标题,例如姓名、邮政编码。所以我们可以为不同的用户找到多次相同的meta_key。
meta_value:对 meta_key 的回答,这是它找到保存数据的地方。
简化用户示例:
umeta_id | user_id | meta_key | meta_value
-----------------------------------------------------------------
1 | 1 | name | Toto
2 | 1 | postcode | 66000
... | 1 | ... | ...
15 | 1 | city | Perpignan
这种结构的问题在于,我认为用户积累的越多,检索邮政编码的请求就越长。
因为一个用户可以有 15 种不同的录音。如果有 10000 个用户,将有 150000 行来检索我们想要的邮政编码。我想听听你的意见,因为我认为这张表的结构有问题。
所以我想创建一个新的用户表,其结构看起来像这样(我不需要城市),以方便查询和响应时间。
user_id | name | postcode
-----------------------------------
1 | toto | 66000
表的创建不用担心,关于通过表usermeta的触发器实现它我只能得到user_id和名称,这要归功于new.user_id的调用,但我无法检索zip代码。下面触发:
insert into users (user_id, name, codepostal) values (
(select distinct user_id from usermeta where user_id = new.user_id),
(select meta_value from te_usermeta where meta_key = 'name' and user_id = new.user_id),
(select meta_value from te_usermeta where meta_key = 'codepostal' and user_id = new.user_id)
)
我告诉自己更新会更糟。有人可以指导我吗?提前谢谢你。
【问题讨论】:
-
所以你假设它会很慢并且想要改变关于 wordpress 如何工作的一个非常基本的事情(EAV 模型在 wordpress 中被大量使用)。你可能不应该那样做。特别是如果您只检索单个信息,EAV(具有适当的索引)不应该比您的其他查询慢。此外,150k 行实际上并没有太多数据,可能会累积到一些 MB,这将很好地适合您的缓存/内存(通常以 GB 为单位)。如果它很很慢,你应该添加一些细节(特别是
explain yourquery的输出,你可能会丢失索引)。 -
你好 Solarflare 我用一个问题来回答我的问题
标签: mysql wordpress insert sql-update database-trigger