Bret Taylor在这篇博文中接头了SchemaLess Design:http://bret.appspot.com/entry/how-friendfeed-uses-mysql
看起来他们将差异类的工具存储到一个表中.然后构建更多的索引表.
我的题目是如安在一个类上构建索引.
譬喻,用户的博客是{id,userid,title,body}.用户的推文是{id,tweet}.
假如我想为用户的博客构建索引,我该怎么办?
最佳谜底
这很简朴 – 大概比你想象的要简朴.
存储博客实体时,您虽然要插入主实体表.博客是这样的:
CREATE TABLE entities (
id INT AUTO_INCREMENT PRIMARY KEY,entity_json TEXT NOT NULL
);
INSERT INTO entities (id,entity_json) VALUES (DEFAULT,'{userid: 8675309,post_date: "2010-07-27",title: "MySQL is NoSQL",body: ... }'
);
您还可觉得每个逻辑范例的属性插入单独的索引表.行使您的示例,博客的用户标识与推文的用户标识差异.因为您方才插入了博客,因此您可以插入索引表中的博客属性:
CREATE TABLE blog_userid (
id INT NOT NULL PRIMARY KEY,userid BIGINT UNSIGNED,KEY (userid,id)
);
INSERT INTO blog_userid (id,userid) VALUES (LAST_INSERT_ID(),8675309);
CREATE TABLE blog_date (
id INT NOT NULL PRIMARY KEY,post_date DATETIME UNSIGNED,KEY (post_date,id)
);
INSERT INTO blog_date (id,post_date) VALUES (LAST_INSERT_ID(),'2010-07-27');
不要插入任何推文索引表,由于你方才建设了一个博客,而不是一条推文.
您知道blog_userid参考博客中的全部行,由于这是您插入它们的方法.因此,您可以搜刮给定用户的博客:
SELECT e.*
FROM blog_userid u JOIN entities e ON u.id = e.id
WHERE u.userid = 86765309;
你的评述:
是的,您可以将现实列添加到实体表中,以查找合用于全部内容范例的任何属性.譬喻:
CREATE TABLE entities (
id INT AUTO_INCREMENT PRIMARY KEY,entity_type INT NOT NULL,creation_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,entity_json TEXT NOT NULL
);
entity_type和creation_date的列应承您定时刻次序(或反向时刻次序)爬行实体,并知道哪组索引表与给定行的实体范例匹配.
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|