在sql中拥有更多或更少的表是否更好?

时间:2011-08-09 11:31:38

标签: sql database-design

我有一个大型数据库,其中一个表称为Users

数据库中有两种用户 - 基本用户和高级用户。在users表中,有29列。但是,其中只有12个适用于基本用户 - 其他17个列仅用于高级用户,而对于基本用户,它们都只包含null的值。

这是一个好的设置吗?比如说将两种用户分成两个不同的表,或者将高级用户拥有的所有额外字段放在一个单独的表中会更有效吗?

5 个答案:

答案 0 :(得分:11)

最好拥有正确的数量的表 - 这可能会更多或更少,具体取决于您的需求。

对于您的具体情况,您应该始终以第三范式开始,并且只有在绝对必要时(例如表现)才会恢复为较小的形式,并且只有在您了解后果时才会恢复。

属性(列)属于表,如果它依赖于键,整个键而不是键(所以请帮助我,Codd)。

你的其他17列是否依赖于用户表中的密钥是有争议的,但我仍然会将它们分开,只是为了节省空间。

让您的基本用户表包含12列(包括某种类型的唯一键)和带有其他列的高级用户表,以及该键,以便您可以将每行的行绑定在一起。

如果您的用例是用户可以拥有17个属性中的任何一个,但可以可以更进一步并拥有一对多的关系,但这似乎不是您的意思已经描述过了。

答案 1 :(得分:1)

是的,最好将这个表分开,但不能分成两个。最好分成三个表

用户表 -   包含用户和Adavace用户的共同属性

UserID(PK)
UserName

基本用户 -   包含基本用户属性并使用用户表和外键的主键

USerID(FK) - from user table 
BasicUsedetail

推进用户 -     包含高级用户属性并使用用户表和外键的主键

USerID(FK) - from user table
AdvanceUsedetail

答案 2 :(得分:1)

取决于:

如果列数很大,那么创建两个表将更有效,因为您不会为17列保留空间,最终保留为空。

您可以始终在前面添加两个表格的视图,这样您的应用程序代码就不会受到影响。

答案 3 :(得分:1)

在这种情况下,在检索数据的速度方面使用“每个类层次结构的单个表”是有效且更有效的,但是如果插入一个BasicUser,它将为每个元组保留17个列,而不是什么。这种情况非常频繁,只有provided by ORMs such as Hibernate。使用这种方法可以避免表之间的连接,根据具体情况可能会很昂贵。 不好的是,如果您的设计需要根据用户类型进行扩展,则需要添加其他许多列为空的列。

答案 4 :(得分:0)

通常情况下并不重要,但如果你有很多用户,而且只有少数用户是高级用户,那么拆分可能会更好。据我所知,没有关于何时分裂的确切规则,何时没有。