我目前有一个应用程序,允许人们查看和共享10种不同类型的帖子(如SportsPost、WorldNewsPost、TechnologyPost等)。所有posts类型在概念上都是相同的,但它们共享的列很少。例如,所有帖子都有user_id、description、email_on_question和email_on_bid列,但最重要的是将有10-20个唯一字段。总之,我认为60列中大约有8列是在post类型之间共享的。
由于有大量的唯一列,而且由于某些post类型具有独特的行为和子类型,我最初决定使用混凝土表继承 --每个对象都由一个单独的表表示,共享列在每个表上被重复:
-- SportsPost -- | -- WorldNewsPost -- | -- TechnologyPost --
user_id user_id user_id
description description description
team location industry这种方法的问题是很难查询和聚合所有的帖子。我有一个仪表板视图,其中列出了最近创建的20个帖子,为了检索该视图的数据,我必须对10个不同的表执行单独的查询!我在事务中执行所有10个查询,以避免多次往返,但我仍然担心,随着应用程序规模和新的post类型的创建,查询的性能将非常差。
现在我正在考虑切换到单表继承。我只需要执行一个查询,而不是对仪表板视图执行10+查询。这听起来像是一个合理的方法吗?STI (除了空列之外)是否有我不知道的缺点?
发布于 2014-11-14 17:45:36
如果您主要关注获取20条最新记录的复杂性,可以编写一个执行UNION所有表的视图,或者创建一个包含所有公共列的空父表,并使用PostgreSQL特定的继承特性继承所有其他表,以隐藏查询的视觉复杂性。尽管它可能不会提高查询的性能。
按照您的建议更改结构很可能会使您询问的特定查询更快,但其他只查询一种类型的记录的查询可能会变得更糟。您必须决定哪些查询更常见,哪些更重要。
https://dba.stackexchange.com/questions/82574
复制相似问题