【问题标题】:SQL syntax to combine several tables用于组合多个表的 SQL 语法
【发布时间】:2010-02-28 13:03:41
【问题描述】:

我需要显示一个列表,按日期排序,其中包含不同类型的数据、图像、视频等等。

我想您可以为每种类型创建一个单独的表,并使用诸如 FULL OUTER JOIN 之类的东西(模拟为 sqlite 不支持它)并按日期排序。但这会很复杂,因为我仍然需要在所有表中都有唯一的 ID。

也许有一个包含 ID 和日期的主列表,然后在类型表中加入?但是使用 sqlite 的性能有多糟糕?我真的很想避免使用包含所有组合类型可能需要的列的超级表。

还有什么想法?

【问题讨论】:

  • 你能告诉我们你的想法的表模式吗?

标签: java sql android sqlite


【解决方案1】:

您应该尝试构建并查看您获得的性能。
SQLite 是非常快的引擎,在移动设备上闪存速度较慢。但即使有上万条记录,您也可以获得快速查询。

除非你没有它,否则你不应该对性能造成影响。

【讨论】:

  • 当然,但我主要想知道这是否是一个好的数据库方案。我是否应该使用主列表?
  • 我会创建一个名为 listentry 的表,其中包含 id、日期等...然后使用附加表来存储特定类型的附加数据,例如 listentry_commentslistentry_images、@987654324 @.
  • 然后为其他表使用多个 LEFT JOIN?
  • 要么加入,要么在需要时执行另一个查询来显示它们。请注意,在列表中,您不会仅显示项目名称的所有值,因此没有任何目的加入表格。
  • 啊,是的。我需要加入,因为我想内联显示(至少一些)东西,比如图像。谢谢!
【解决方案2】:

我知道将类层次结构映射到关系数据库表的三种模式:

  1. 整个层次结构的一个表。每一行都将包含层次结构类的所有属性的并集。如果课程发生变化,我认为这很难维持。当然,每一行都需要一个类型标识符。
  2. 层次结构的每个具体类都有一个表。在这种情况下,表示具体类的表包含该类的属性以及所有抽象基类的属性。抽象类不直接映射。
  3. 每个抽象类和具体类都有一个表。在这种情况下,每个类都直接映射到一个表。

1. 的优点是它很容易实现您想要做的事情,即读取属于您的类层次结构的所有对象。不过,你会浪费一些空间。在 2. 中,您可以读取一个选择语句的子选择中的每个表,其中其他类的属性具有恒定的虚拟值,然后在单个 SQL 语句中将它们联合在一起。在 3. 中,查询变得有点复杂:您必须将具体类表与子选择中的基类表进行 INNER JOIN。不过,在这两种情况下,您都不需要 FULL OUTER JOIN。


附录:

假设您有一个对象层次结构,其中包含一个Person 类和两个子类StudentTeacher。在 2. 中,您将创建两个表 STUDENT 和 TEACHER,它们都有一个列 NAME。 STUDENT 表有一个额外的 YEAR 列,而 TEACHER 表有一个 SALARY 列。您的查询可能如下所示:

    SELECT 'STUDENT' AS TYPE, NAME, YEAR, NULL AS SALARY FROM STUDENT 
UNION SELECT 'TEACHER' AS TYPE, NAME, NULL AS YEAR, SALARY FROM TEACHER

然后您可以检索并使用它来用数据填充您的对象或使用SimpleCursorAdapter 或任何您喜欢的方式显示。

【讨论】:

  • 你能说明#2吗?或者只是告诉我如何进行查询?
  • 但这要求您使用相同的列(作为年份为空)。有没有办法做到这一点而不必这样做?就像在主表上使用连接一样。我自己尝试过,但无法弄清楚如何为每个连接加入主表,因为连接使用最后一条语句。像这样的东西只是所有连接都针对条目表:pastebin.com/W6paVxQ9
【解决方案3】:

这是你想在数据库中做的事情吗?我猜你在代码中将数据映射到不同类型的对象(例如class Videoclass Image...),这样你也可以在那里组合数据。

【讨论】:

  • 是的,这是我想在数据库中做的事情。我不明白你答案的另一部分:c
  • 抱歉不清楚。我的想法是,如果您在数据库中有不同类型的数据,假设您有一个 Video(id, date...) 和 Image(id, date...) 那么您可能也有与 Java 相同的类型类。这使您能够在代码中进行排序。我猜你目前没有做任何对象关系映射?
猜你喜欢
  • 1970-01-01
  • 2018-02-16
  • 2017-09-18
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多