代码之家  ›  专栏  ›  技术社区  ›  alexanderblom

组合多个表的SQL语法

  •  1
  • alexanderblom  · 技术社区  · 14 年前

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

    我想每种类型都可以有一个单独的表,使用完全外部连接(模拟为sqlite不支持它)和按日期排序。但这会很复杂,因为我仍然需要在所有表中都有唯一的id。

    也许有一个包含id和date的主列表,然后加入types表?但是使用sqlite的性能有多差?我真的很喜欢避免使用包含所有组合类型可能需要的列的超级表。

    还有想法?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Pentium10    14 年前

    你应该试着建立和看看什么性能击中你。
    sqlite是一个非常快的引擎,在移动设备上,闪存速度较慢。但即使有成千上万条记录,你也能得到快速的查询。

    在你没有表演之前,你不应该胡闹。

        2
  •  1
  •   Robert Petermeier    14 年前

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

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

    1的优势。它相当容易实现您想要做的事情,即读取属于您的类层次结构的所有对象。不过,你浪费了一些空间。在2.中,您可以读取一个select语句的子select中的每个表,其中包含其他类的属性的常量伪值,然后将它们合并到一个sql语句中。3。查询变得有点复杂:必须将具体的类表与子选择中的基类表进行内部连接。不过,在这两种情况下都不需要完全的外部连接。


    附录:

    假设有一个对象层次结构 Person 类和两个子类, Student Teacher . 在2.中,您将创建两个表,student和teacher,它们都有一个列名。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 或者你喜欢的任何东西。

        3
  •  0
  •   ponzao    14 年前

    这是你想在数据库中做的事情吗?我猜在代码中,您将数据映射到不同类型的对象(例如 class Video , class Image …)所以你也可以把数据合并在一起。