【问题标题】:How implement one-to-many objects database in sqlite for android如何在sqlite for android中实现一对多对象数据库
【发布时间】:2016-03-31 20:39:32
【问题描述】:

我对@9​​87654321@ 和SQL 还很陌生,我正在努力解决以下问题:

我的应用将显示社区成员列表。如果我点击一个成员,我可以看到成员发布的帖子列表。帖子是具有名称、时间和消息的对象。如何将其存储在SQLite 数据库中,以便我可以通过userid 查询数据库并获取特定用户的帖子列表。

我有一个包含这些列的用户表:

USER_ID | NAME

我有一个包含这些列的推文表:

USER_ID | NAME | TIME | MESSAGE

我的问题是:link 这两个表的最佳方法/结构是什么?我是为每个用户创建一个新的推文表,还是将所有推文存储在一个长表中,先为用户 1 发推文,然后为用户 2 等推文?

我不一定是在寻找代码转储,而是对逻辑的解释。

【问题讨论】:

  • 我会在 Tweet 表中添加一个tweet_id,然后为每条推文存储一行。
  • @TerrySeidler 谢谢,我会试试的。
  • 您以后可能需要删除一条推文。特里的做法更清楚,因为 tweet_id

标签: android sql sqlite


【解决方案1】:

已经给出并接受了答案,但我想补充一下。

你想要的是一张有用户的表,users。在此表中,您存储您的用户信息(user_idname)。

在您的Tweets 表中,存储所有用户的所有推文。每行一条推文。我将tweet_id 用作PRIMARY KEY 用于Tweets 表。

然后,您可以像 Dave Swersky 所说的那样,通过 JOIN 在代码中“链接”两者。

例如:

Users
--------------------------
user_id   |   user_name
--------------------------
   123    |    'Terry'
   34     |    'Pierre'

Tweets
-----------------------------------------------------------------------
tweet_id |   user_id   |  time      |         message     
-----------------------------------------------------------------------
   0     |    123      | 135646     |  'This is a tweet'
   1     |    123      | 132646     |  'This is another tweet by Terry'
   2     |    34       | 352646     |  'Pierre\'s tweet'

我不确定name 在您的Tweets 表中的用途。据我所知,推文没有名称/主题(?)。您确实不需要将用户名存储在tweetsusers 表中。

如需快速 SQLFiddle,请转到此处:http://www.sqlfiddle.com/#!2/43492/1/0

加入

SELECT u.user_id, u.name, t.time, t.message, t.time 
FROM my_users u
INNER JOIN tweets t ON u.user_id = t.user_id

【讨论】:

  • 这似乎是最好的方法!
  • @Terry Seidler 非常感谢。当我获得更多积分时,我会对此表示赞同……而且与 sqlfiddle 的链接真是太棒了。太棒了。
  • 没问题!祝你好运!我在 SQL fiddle 上的“时间”字段只是一个 varchar 值,但这没关系;)
【解决方案2】:

这是一个典型的“JOIN”场景,其中用户和帖子之间存在一对多的关系。

以下是显示所有用户及其帖子的查询示例:

SELECT u.User_ID, u.Name, p.Time, p.Message
FROM Users u INNER JOIN Posts p ON u.User_ID = p.User_ID

这将生成一个包含四列的结果集。每个“推文”都将与其相关的用户记录一起显示。 “你”。和“p”。语法是用于使查询更易于阅读的表别名。

【讨论】:

  • 谢谢。我是将所有用户的所有帖子存储在一个 Post 表中,还是每个用户都有一个单独的 Post 表?
  • @Pierre 规范化数据库通常包含每个“类型”存储的数据的一个表,因此无需创建额外的表。您可以将用户和相关帖子添加到这两个表中。
  • 好的,清楚。非常感谢您提供如此快速、知识渊博和有用的答案。
  • 假设帖子总数为 4,因此上述查询将返回 4 行,每行包含 u.Name(冗余)?
【解决方案3】:

你需要有两个表:

1.用户

USER_ID |姓名

2.推文

USER_ID |时间 |留言

现在解释一下:

表一是代表用户,里面有关于用户的所有数据,比如姓名、电话、地址等。

表 2 是所有用户的所有推文,并且有一列连接用户和他的推文。 在表 2 中 USER_ID 是外键,它正好指向用户表中的一行。

要获取一个用户的所有推文,您可以编写下一个查询:

Select TWEETS.MESSAGE, TWEETS.TIME
from Users, TWEETS
where Users.USER_ID = TWEETS.USER_ID
and Users.NAME = "Pierre";

【讨论】:

  • 谢谢,真的很有帮助。不幸的是,我没有足够的分数来投票给你的答案......
  • 通过回避 JOIN 关键字,这个答案提供了一个同样适用于 sqlite 的解决方案,正如 OP 所暗示的那样!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 2011-03-02
  • 2010-11-18
  • 2013-05-12
  • 2013-02-07
  • 2010-11-17
相关资源
最近更新 更多