SQL表组织

时间:2012-06-12 13:30:15

标签: sql database-design

我有许多需要跟踪的帐户。这些帐户都非常相似,例如:

account_number, date_opened, current_expenditure etc. 

现在,这些帐户有三种类型(我们称之为A,B,C型) 这些帐户类型中的每一种都需要至少一个其他字段,该字段对于其类型是唯一的。例如:

Type A: account_number, date_opened, current_expenditure, owner
Type B: account_number, date_opened, current_expenditure, location
Type C: account_number, date_opened, current_expenditure, currency

我的问题是我是否应该将这些组合成一个大表,其中一列表示帐户类型(将不相关的字段留空):

Table 1: accounts
Table 2: accts_emp_maps

Account Columns: 
account_number, type, date_opened, current_expenditure, owner, location, currency

或者,我应该为每个帐户类型设置一个单独的表吗?请记住,将有其他表将员工映射到这些帐户。如果我将帐户分成不同的类型,我也需要拆分地图。 IE:

Table 1: A_accounts
Table 2: A_accts_emp_maps
Table 3: B_accounts
Table 4: B_accts_emp_maps
Table 5: C_accounts
Table 6: C_accts_emp_maps

3 个答案:

答案 0 :(得分:1)

我会选择带有owner, location, currency额外列的单表方法。它会让你的生活更轻松。

如果它太大,您可以按类型对其进行分区。

答案 1 :(得分:1)

经典地,您可以使用超级键/子类型模式来确保只有一个所有者,位置,货币

  • 一个包含公共列和类型列的表
  • PK +类型(A,B或C)列上的唯一超级密钥
  • 带有PK +类型键的三个子表。这是您添加特定列的地方
  • 检查子类型约束的约束以限制子表中的A,B或C

现在,在这种情况下,我会考虑使用冗余列来简化

示例:

答案 2 :(得分:-1)

在你列出的两个选项中,我肯定会选择第一个。它适用于大多数应用程序,并且表格可以更简单地手动查询。 (第二个提议的设计在三组账户表中复制了大量信息)。

但是,根据您的需要,可能更好的more normalized数据库设计是这样的:

Table: accounts
===============
number, type, date_opened, current_expenditure

Table: account_owners
=====================
account_number, owner

Table: account_currencies
=========================
account_number, currency

Table: account_locations
========================
account_number, location