什么是更好的数据库表关系设计

时间:2013-05-28 15:46:22

标签: database oracle database-design

我有一组用于描述清单的表,以及它们的属性列表(问题)。属性可以在检查表之间共享,这就是我有CHECKLIST_TO_ATTRIBUTE表的原因。当有人启动清单的实例时,会执行查询以获取当前问题,然后将这些问题插入到答案表中。现在我们要显示清单,但按类别对属性进行分组。以下是我在此要求之前所拥有的内容,我已经包括了所有的pertenent列。

CHECKLIST_CLASS
    CL_CLASS_ID
    CL_VERSION

ATTRIBUTE
    ATTRIBUTE_ID
    DESCRIPTION

CHECKLIST_TO_ATTRIBUTE
   CL_CLASS_ID
   ATTRIBUTE_ID

CHECKLIST_INSTANCE
   CL_INSTANCE_ID
   CL_CLASS_ID

ANSWER
   CL_INSTANCE_ID
   ATTRIBUTE_ID
   VALUE

一旦检查表被实例化并且我们修改了检查表(修订它),实例化的检查表仍然必须引用原始问题。我显示清单实例的方式是查询ANSWER表,使用JOIN到ATTRIBUTE表并迭代结果集。

显然我会添加一个分类表

 ATTRIBUTE_CATEGORY
   AC_ID
   DESCRIPTION   

但是我在哪里添加refence到这个表?如果我将AC_ID添加到CHECKLIST_TO_ATTRIBUTE定义表中,那么我认为我有两个选项。

1)在构建核对表实例时,还要修改ANSWER表以包含AC_ID。

ANSWER
   CL_INSTANCE_ID
   ATTRIBUTE_ID
   VALUE
  *AC_ID*  

2)或单独留下ANSWER表,当我查询它以进行显示时,执行一些JOINS以从CHECKLIST_TO_ATTRIBUTE表中获取AC_ID。我知道ANSWER.CL_INSTANCE_ID,因此请加入CHECKLIST_INSTANCE表以获取CL_CLASS_ID,然后将其与ANSWER.ATTRIBUTE_ID一起使用以从CHECKLIST_TO_ATTRIBUTE表中获取AC_ID。

什么是更健全的设计?还是有其他选择我不考虑?我不想只将AC_ID添加到属性表中,因为这样就可以耦合属性和类别。可以在核对表之间共享属性,这样最终我们可以根据指标汇总指标,无论它在哪个核对表类中找到。

即多少尺寸不正确,可以在内阁蓝图审查清单以及内部房间框架布局审查清单上。

1 个答案:

答案 0 :(得分:0)

AC_ID中添加CHECKLIST_TO_ATTRIBUTE和新的CATEGORY表是合理的设计。在AC_ID中添加ANSWER也不错,虽然可能会引入一些完整性问题(答案类别和问题类别可能不同),但会导致连接数减少,但检查无法解决。

我想到的另一种方法是将类别作为清单项目的特例来处理,该项目可以链接到其他清单项目。如果您的用例需要嵌套类别(如果您这样做不清楚),这将特别方便。

CHECKLIST_TO_ATTRIBUTE
  CL_CLASS_ID
  ATTRIBUTE_ID
  CL_TYPE -- (tells if this is a plain checklist or a category)
  PARENT_CL_ID  -- (points to the parent category checklist item, NULL if this is a top level category)