2011-03-16 108 views
0

即时创建一个数据库,记录来自多个表单的细节,每个表单都有一个状态和一个修订版本。我想创建一张表,其中包含所有表单的所有修订版和状态数据,但是我有点卡住了设计,以及如何定义表格表和1修订版和状态表之间的关系。数据库设计

我有的表格如下。 伊夫略表为简单起见

tasks 
--------- 
pk int id 


briefs 
--------- 
pk int id 

Revisions 
--------- 
fk formId 
int status 

我要的任务和内裤表链接到修订表,但显然会有与父表的PK的冲突。是像查找表一样使用修订表的最佳选择,并将修订表的主键存储在任务和摘要表中。

在此先感谢

回答

0

选项1

创建一个形式表,即表ID的中央源。当插入任务/摘要/ etc(我认为可能还有更多)时,首先插入到Forms表格中,然后在任务或摘要中使用该ID作为PK/FK。

然后你有FormID in Revisions只是引用Forms中的FormID。

您可能想要在Forms表格中记录表单类型,并且可能会强制执行,如果已经在表单中插入了“1,Task”,那么您可以插入1的唯一表格是Tasks表格。有办法做到这一点。

您可能还想隐藏视图/触发器背后的一些事实(因此您只需将其插入到任务中,然后将其插入到Forms中,等等)。

选项2

在修订表创建每个表一列。添加一个约束,使其中的某一列不为空。这允许您使用更具体的外键约束(与选项1不同,因为表单中存在Form(“1,Task”),所以不能保证Tasks表中会有一行)。但是,如果您添加新的表单类型,则必须将更多列添加到修订版本。

还有一些其他的选择,但这些是我们想到的两个。

+0

我想我会使用上面的两个选项的组合,并为每个表具有列的表格表,然后使用表格表的pk链接到修订表。我有其他表需要链接到每个表,所以我可以使用表格作为所有这些的中心枢纽。谢谢@Damien_The_Unbeliever – 2011-03-16 12:03:08

0

你可以这样做在两个表中,如果任务和内裤只是在他们的ID,并没有其他的列,或者如果列是相同的。

tasks_and_briefs 
---------- 
pk int id 
int task_or_brief (e.g 0 for Task, 1 for Brief) or varchar task_or_brief (e.g. "Task", "Brief") or whatever else you wish. 

revisions 
---------- 
pk int formId 
int id 
int status 
+0

任务和摘要表有更多列。我只是删除它们以保持简单。对于混淆的道歉 – 2011-03-16 11:33:45

0

听起来好像你可以将任务和摘要视为超类型“形式”的子类型。 (我使用亚型在他们的关系型数据库的设计感,而不是在他们的面向对象编程的感觉。)

create table forms (
    form_id integer not null, 
    form_type char(1) not null check (form_type in ('T', 'B')), 
    other_form_columns char(1), 
    primary key (form_id, form_type) 
); 

create table tasks (
    form_id integer not null, 
    form_type char(1) not null default 'T' check (form_type = 'T'), 
    other_task_columns char(1), 
    primary key (form_id, form_type), 
    foreign key (form_id, form_type) references forms (form_id, form_type) 
); 

create table briefs (
    form_id integer not null, 
    form_type char(1) not null default 'B' check (form_type = 'B'), 
    other_brief_columns char(1), 
    primary key (form_id, form_type), 
    foreign key (form_id, form_type) references forms (form_id, form_type) 
); 

已经这样做了,你可以创建修订的表引用“形式”中的主键。

create table revisions (
    form_id integer not null, 
    form_type char(1) not null, 
    revision_num integer not null check (revision_num > 0), 
    revision_status varchar(20) not null, 
    other_revision_columns char(1), 
    primary key (form_id, form_type, revision_num, revision_status), 
    foreign key (form_id, form_type) references forms (form_id, form_type) 
); 

这种特殊的结构假设

  • 你可以为每个 版本号以上的状态,以及任务的
  • 修订和内裤的修订意味着同样的事情。

如果任务修订版与简要修订版不同,那么您需要一张表作为任务修订版,另一张表用于简要修订版。他们的主键不会引用超类型表“forms”;他们会引用子类型表“任务”和“简报”。