对不起,如果我在错误的位置发帖,我是新来的且是法国人(抱歉,我修改过的google翻译),通常我还是会设法解决,但在这个问题上我还是不敢相信。
我正在使用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
和名称,但是我无法获取邮政编码。在下面触发:
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)
)
我告诉自己,更新会更糟。有人可以指导我吗?我先谢谢你。
答案 0 :(得分:0)
我不知道,但是在另一个网站上,他们给了我这个触发条件:
CREATE TRIGGER `ajouter`
BEFORE insert ON `tabone`
FOR EACH ROW
BEGIN
DECLARE _name VARCHAR(255) DEFAULT NULL;
DECLARE _postcode INTEGER DEFAULT NULL;
SET _name = (select name from `tabtwo` where user_id = new.user_id);
SET _postcode = (select postcode from `tabtwo` where user_id = new.user_id);
IF new.meta_key = 'name' then replace into `tabtwo` (`user_id`,`name`,`postcode`) values (new.user_id, new.meta_value,_postcode); END IF;
IF new.meta_key = 'postcode' then replace into `tabtwo` (`user_id`,`name`,`postcode`) values (new.user_id,_name,new.meta_value); END IF;
它有效。
用索引优化的新表上的查询如何比非结构化wordpress EAV模型的表上的查询慢?