java – 使用类似子类的关系查询表

在我的应用程序的数据库中,目前有3个表:

>父表 – (总目标)
> ChildA
> ChildB

如果我要用OOP说话,ChildA和ChildB都是Parent表的“子类”,但它们并不相似.

表之间的关系:

>父表中的一行有一个整数,用于定义该行是与类型A(ChildA)还是类型B(ChildB)相关.
>在ChildA和ChildB中都有对父表(id)中相关行的引用.只有1个与子项相关的父行,并且还可以有1个与父项相关的子项(一对一的r / s).
>在所有表中没有任何具有相同名称的列对.

要做的是基本上检索Parent表中的所有行,然后根据每行的类型列从ChildA或ChildB中检索其他相关信息.

如果我首先检索所有父行,然后使用循环遍历行并且每行查询n次,这将非常容易,但我认为这可能是非常低效的.

我想知道是否有更好的方法,甚至可能在一个查询中.

我知道我可以使用INNER JOIN或其他东西,但我不确定它在这种情况下是如何工作的,我需要将第二个表连接到第二个表(并且列的数量内容都不同).

所以问题是,预制它的最有效方法是什么?

编辑:
我看到这个问题被标记为另一个问题的副本,但是,我不问如何设计我的数据库,但是如何查询它.
我正在使用Table-Per-Type设计,并希望获得所有不同类型的所有行(目前为2).
在我希望从单一类型中获取所有行的情况下我会知道如何这样做,但在这种情况下不会这样做,这就是为什么我要询问是否以及如何使用单个查询(使用例如,一种类似于JOIN的机制.我知道我可以通过查询两次来实现它,但我想学习一种更有效的方法来实现它.

解决方法:

我可以想到两种不同的方法(有它们的优点和缺点:)

1)具有与子类型一样多的查询并一次检索子类型.在示例中,您将有两个查询

select * from ChildA where id in (select childId from Parent where childType='A')
select * from ChildB where id in (select childId from Parent where childType='B')

这将以相对合理的性能为您提供应用程序和数据库之间尽可能低的数据传输.您将“浪费”数据库为过滤Parent表所做的工作(数据库必须执行两次)

2)您有一个查询,它检索ChildA和ChildB作为相同结果集的一部分,如下所示:

select ChildA.*, ChildB.* from Parent
    left outer join ChildA on Parent.ChildId=ChildA.id
    left outer join ChildB on Parent.ChildId=ChildB.id

上述查询仅在子项具有唯一ID时有效(即,如果存在ID为5的ChildA,则不存在ID为5的ChildB).如果不是这种情况,你需要一个稍微“丑陋”的查询

select ChildA.*, ChildB.* from Parent, ChildA, ChildB
    where (Parent.ChildType='A' and Parent.ChildId=ChildA.id) or
          (Parent.ChildType='B' and Parent.ChildId=ChildB.id)

这将为您提供一个结果集,其中包含来自ChildA和ChildB的所有列,其中包含许多NULL值(对于每个ChildA记录,所有ChildB列都将为NULL).这样,您只有一个查询(在第一种方法中可能比多个查询执行得更快),但您需要发送更多数据.

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能