gpt4 book ai didi

mysql - 关于FriendFeed的MySql SchemaLess设计的问题

转载 作者:可可西里 更新时间:2023-11-01 07:01:46 28 4
gpt4 key购买 nike

Bret Taylor 在这篇博文中讨论了 SchemaLess 设计:http://bret.appspot.com/entry/how-friendfeed-uses-mysql

看起来他们将不同类的对象存储到一张表中。然后建立更多的索引表。

我的问题是如何在一个类上建立索引。

例如,用户的博客是{id,userid,title,body}。用户的推文是 {id,userid,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: ... }'
);

您还可以为每个逻辑类型的属性插入一个单独的索引表。使用您的示例,博客的用户 ID 与推文的用户 ID 不同。由于您刚刚插入了一个博客,因此您可以插入到博客属性的索引表中:

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 的列允许您按时间顺序(或倒序)抓取实体,并知道哪组索引表与给定行的实体类型匹配。

关于mysql - 关于FriendFeed的MySql SchemaLess设计的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3349188/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com