【发布时间】:2017-01-22 12:16:31
【问题描述】:
我正在阅读this article about a Twitter-like application. 将存储推文、用户、喜欢等的存储类型是关系数据库。数据库方案描述here绘制here.
作为一名 Android 开发人员,我使用 SQLite 编写了我的示例。这就是我的编码方式:
create table users (_id integer primary key, username text unique, first_name text, last_name text);
create table tweets (_id integer primary key, content text, created_at integer, user_id integer, foreign key(user_id) references users(_id));
create table connections (_id integer primary key, follower_id integer, followee_id integer, created_at integer, foreign key(follower_id) references users(_id), foreign key (followee_id) references users(_id));
create table favorites (_id integer primary key, user_id integer, tweet_id integer, foreign key (user_id) references users(_id), foreign key (tweet_id) references tweets(_id));
现在让我们插入一些数据。
用户:
insert into users values (1, 'user1', 'Lorem', 'Ipsum');
insert into users values (2, 'user2', 'Dolor', 'Sit');
insert into users values (3, 'user3', 'Foo', 'Bar');
insert into users values (4, 'user4', 'Qwerty', 'Trewq');
一些推文:
insert into tweets values(10, '1 Tweet from user1', 1100, 1);
insert into tweets values(11, '2 Tweet from user1', 1101, 1);
insert into tweets values(12, '3 Tweet from user1', 1102, 1);
insert into tweets values(13, '4 Tweet from user1', 1103, 1);
insert into tweets values(14, '1 Tweet from user2', 1103, 2);
insert into tweets values(15, '2 Tweet from user2', 1103, 2);
insert into tweets values(16, '1 Tweet from user3', 1103, 3);
insert into tweets values(17, '2 Tweet from user3', 1103, 3);
insert into tweets values(18, '1 Tweet from user4', 1107, 4);
最喜欢的(和喜欢的一样):
insert into favorites values(1, 2, 11);
insert into favorites values(2, 3, 13);
insert into favorites values(3, 4, 15);
有一个关于数据库方案的问题:
您认为您可以支持我们的数据库设计能力吗 为给定用户显示一个页面,其中包含他们最新的推文 至少收藏过一次?
是的,这就是为什么要查询:
sqlite> select favorites._id, tweets._id as tweet_row_id, tweets.content from favorites join tweets on tweets.user_id=1 and tweets._id = favorites.tweet_id order by tweets._id desc limit 1;
_id tweet_row_id content
---------- ------------ ------------------
2 13 4 Tweet from user1
解释:
左边的数据集是表favorites。正确的数据集是表 tweets。我加入了这两个数据集。然后 tweets.user_id=1 and tweets._id = favorites.tweet_id 对结果数据集的每一行进行评估,作为布尔表达式。如果结果为真,则包含该行。 order by tweets._id desc 用于获取最新的推文(tweets._id 越大,推文越新)。 limit 用于限制行数。如果用户多年来一直使用我们的类似 Twitter 的应用程序,我们将显示最新的 10 或 20 条推文。
我的问题。
- 我的数据库方案有什么问题吗?为简单起见,我省略了
not null、unique和其他列约束。 - Here原作者说:
第一个关系是通过将用户 ID 粘贴到每条推文来解决的。 这是可能的,因为每条推文都是由一个用户创建的。 当涉及到关注用户和 收藏推文。那里的关系是多对多的。
“第一个关系”是用户-推文。
这里为什么需要多对多?在我的方案中,我只使用一对多。
更新 1
【问题讨论】:
标签: sql database-design