从您的问题来看,您还没有完全了解关系数据库。您是否意识到过程代码和面向对象编程之间的区别?走向 RealtionalDB 是一个类似的步骤。
始终考虑数据集,即使该集合仅包含一条记录。一个表是一个数据集,一个查询结果是另一个,一个视图是一个,一个连接是一个结合了两个。
至于您的问题:
我知道一个故事由 memorybox 表中的一条记录和任何媒体表中的一条或多条记录组成。
为此,您的表结构非常好。我
想table memoryboxes(id int, metadata varchar),,,,
。
table fotos(memorybox_id int, thefoto clob)_
table audios(memorybox_id int, theaudio club)table videos(memorybox_id int, thevideo clob)
要获得“完整故事”,您最好根据 memorybox_id 从所有这些表中进行选择。这意味着 4 个查询(为了整洁而在一个事务中)一个接一个。从这些结果集中构建 xml。
至于连接:(
左)连接的行为应该与您描述的完全一样。它基于前提组合数据集(在您的情况下,ids 相等)。即使“右侧”的数据集中没有匹配的记录,左连接也允许生成“左侧”数据集中的记录。想想看;这将为您提供与您的谓词匹配的数据集的所有排列。正是你所描述的。
至于分组依据:
分组依据(我猜是 id)将“滚动”一个数据集,并且您会注意到,您需要在分组依据子句中或在分组依据查询中包含列一个所谓的聚合函数(count、min、max、...),这意味着它们要么参与了结果分组(想想表中的复合键),要么它们的最终值将由基础数据集组中的所有数据组成。
长话短说:您的数据库结构很好,使用 4 个单独的查询(在一个事务中)来获取数据。
后续步骤:
稍后,当您想编写一个列出故事中关联媒体数量的查询时,请尝试阅读更多有关联接和分组依据的信息,例如:
select
m.metadata,
count(f.id) as fotocount,
count(a.id) as audiocount,
count(v.id) as videocount
from
memoryboxes m
left join fotos f on f.memorybox_id=m.id
left join audios a on a.memorybox_id=m.id
left join videos v on v.memorybox_id=m.id
group by m.metadata