我需要设计一些数据库表,但我不确定性能影响。在我看来,它更多地是关于读取性能而不是保存数据。
情况
借助模式识别,我可以找出需要在postgresql数据库中保存多少个特定对象的值。 其他数量让我们说固定属性唯一的区别是需要保存相同类型的1,2或3个值。
目前我有3个实体/表,它们的区别仅在于具有相同类型的1,2或3个不可为空的属性。
例如:
EntityTestOne/TableOne {
... other (same) properties
String optionOne;
}
EntityTestTwo/TableTwo {
... other (same) properties
String optionOne;
String optionTwo;
}
EntityTestThree/TableThree {
... other (same) properties
String optionOne;
String optionTwo;
String optionThree;
}
我希望生产中有数百万条记录,并且我正在考虑这种变体的性能影响以及可能的替代方案。
替代
我想到的其他选择:
例如:
EntityOption {
String value;
}
EntityTest {
... other (same) properties
List<EntityOption> options;
}
由于我不是那么强大的数据库设计和使用hibernate我对这些方法的优点和缺点感兴趣,如果有更多的选择。 我甚至想问一下问题,如果postgresql是正确的选择,或者是否应该考虑使用另一个(免费)数据库。
谢谢!
答案 0 :(得分:6)
我认为这个案例很清楚:如果每个对象有三个属性的上限,请使用一个具有可空属性的表。
NULL值不占用数据库中的任何空间。对于每一行,PostgreSQL都存储一个包含哪些属性为NULL的位图。始终存储此位图,除非所有属性都不可为空。有关详细信息,请参阅the documentation 所以在这种情况下不要担心存储空间。
使用三个不同的表或将属性存储在单独的表中可能会导致查询中出现UNION
或JOIN
,这会使查询更加复杂和缓慢。
答案 1 :(得分:1)
创建实体类有很多继承策略,我认为你应该采用单表策略,其中会有一个鉴别器列(由hibernate本身管理),并且每个实体都会使用所有常用字段和一些特定的字段将由特定实体使用,并对其他实体保持为null。 这将提高读取性能。 为你的参考。 : http://www.thejavageek.com/2014/05/14/jpa-single-table-inheritance-example/