何时将模型拆分为多个数据库表?

时间:2010-02-16 07:25:57

标签: database database-design models

我正在使用Ruby on Rails,但我认为这个问题比这更广泛,并且通常适用于数据库设计。

什么时候将单个模型拆分成多个表是个好主意?例如,假设我有一个User模型,并且模型中的字段数实际上已经开始累加。例如,用户可以进入他的网站,他的生日,他的时区,他的等等。

分割模型是否有任何优点或缺点,例如,User表可能只有登录和电子邮件等基本信息,然后还有另一个表,每个用户都有类似UserInfo的表,另一个表是UserPermissions,另一个是UserPrivacySettings或类似的东西?

编辑:要为此添加额外的光泽,除了特定于它们的页面外,很少访问大多数字段。例如,只有在有人点击用户的个人资料时才会访问生日等内容。此外,一些领域(很少被访问)有可能非常大。大多数字段都可能设置为空白或为零。

3 个答案:

答案 0 :(得分:7)

通常,将具有一对一关系的内容放在同一个表中是个好主意。除非您的用户群包含Queen或Paddington Bear,否则用户只有一个生日,因此应该是USERS表的属性。具有一对多关系的事物应该在单独的表中。因此,如果用户可以通过各种方式将多个隐私设置拆分出来。

如果我们想要一次检索所有用户的信息,将一个表拆分成几个表可能会使查询更复杂或更慢。另一方面,如果我们有一组仅以离散方式查询或更新的属性,那么拥有一个单独的表来保存该数据是一个合理的想法。

答案 1 :(得分:3)

这将是一种分析的情况。

当你发现这样一个表中的很多字段都是NULL,并且可以组合在一起(例如UserContactInfo)时,是时候看一下将信息提取到自己的表中了

您希望避免使用只有稀疏输入数据的数十/数百个字段的表。

而是尝试逻辑地对数据进行分组,并创建主表,其中包含大多数填充的字段。然后,您可以创建数据子集,几乎就像在UI上表示它们一样(联系信息,个人兴趣,工作相关信息等)到单独的表格中。

答案 2 :(得分:3)

如果有多列,检索行会更昂贵,特别是如果你通常只需要一些字段。此外,在单独的类中托管诸如地址组件之类的东西是DRY的情况。另一方面,如果确实需要对象的所有字段,则执行复合查询需要更长的时间。

我通常不愿意在几个表上分发类只是为了使代码更具可读性(即没有实际可重用的部分,如地址)。