数据库设计 - 创建仅包含两个值的表,或使其成为具有这两个值之一的列

时间:2012-04-19 17:02:21

标签: database-design

这更像是一个数据库设计问题,我很好奇当只有两组值时,专业数据库管理员会如何处理 - 以下两个设计方案为例,你会选择哪一个;为什么?

情景一

 table INVOICES
 -------------------------------
 id | royalty_fee | royalty_type
 -------------------------------
 1  | 15          | percentage
 2  | 10.00       | fixed
 1  | 25          | percentage
 1  | 25.00       | fixed

...或

情景二

 table INVOICES
 ----------------------------------
 id | royalty_fee | royalty_type_id
 ----------------------------------
 1  | 15          | 1
 2  | 10.00       | 2
 1  | 25          | 1
 1  | 25.00       | 2


 table ROYALTY_TYPES
 -------------------------------
 id | label
 -------------------------------
 1  | percentage
 2  | fixed

3 个答案:

答案 0 :(得分:7)

方法2更好。您的开发人员可以使用第二个表ROYALTY_TYPES进行查找,如果您想要添加新类型或编辑/更新ROYALTY_TYPES的标签,您也可以轻松完成。 如果您在ROYALTY_TYPES中编辑/修改标签,则只需要在一个地方进行更改,表INVOICES将不受影响
编辑:
我通常会在数据库设计方面寻找三件事:
添加是多么容易:在第一种方法中,如果您没有发票的记录,则无法添加新的版税类型。我的意思是,如果你想添加一个新类型,可以说HalfFixed用于将来的发票。如果没有获得HalfFixed类型的发票,您将无法执行此操作 更新有多容易让我们说如果你想更新版税类型固定为'FIX'。如果您遵循第一种方法,那么您将需要在多行中更新它。
删除是多么容易现在,如果要从“版税类型”中删除类型,那么根据您的第一种方法,您必须在表格上运行更新语句并设置特定版税键入为NULL。

答案 1 :(得分:2)

我会使用后者,毫无疑问。

  1. 你能绝对肯定不会有其他版税吗?不,你不能。
  2. 您可以通过外键关系验证royalty_type_id列...对于royalty_type不是这样......您必须使用带有硬编码文本值的检查约束。
  3. 使用royalty_types表,您可以根据需要向版税类型实体本身添加新功能。

答案 2 :(得分:1)

在事务性数据库中,2更好。 1可用于数据仓库系统。