繁体   English   中英

数据库设计

[英]database design

即时通讯会创建一个数据库,该数据库记录来自多个表单的详细信息,每个表单都有一个状态和一个修订。 我想创建一个表,其中包含所有表单的所有修订和状态数据,但是对设计以及如何定义表单表与1修订和状态表之间的关系有点困扰。

我的表格如下。 为了简化起见,Ive缩写了表格

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


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

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

我想将任务和摘要表链接到修订表,但是很显然,它将与父表的pk发生冲突。 是使用修订表(例如查找表)并将修订表的主键存储在任务和摘要表中的最佳选择。

提前致谢

如果任务和摘要中仅包含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

选项1

创建一个Forms表,它是Form ID的主要来源。 插入Tasks / Briefs / etc(我想可能还有更多)时,首先插入Forms表,然后在Tasks或Briefs中将该ID用作PK / FK。

然后,您在修订版中就有FormID,只需在Forms中引用FormID。

您可能想要在Forms表中记录表单类型,并可能强制执行以下操作:如果您在Forms中插入了“ 1,Task”,那么唯一可以插入1的表就是Tasks表。 有很多方法可以做到这一点。

您可能还希望将其中一些事实隐藏在视图/触发器后面(因此,您只需插入Tasks,然后在幕后将其插入Forms等)。

选项2

在修订表中为每个表创建一列。 添加一个约束,以使这些列之一恰好不为空。 这确实允许您使用更特定的外键约束(与选项1不同,在选项1中,仅因为Forms中有一个Form(“ 1,Task”),您不能保证Tasks表中将有一行)。 但是,如果要添加新的表单类型,则必须在“修订”中添加更多列。

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

听起来您可以将任务和摘要视为超类型“表单”的子类型。 (我在关系数据库设计的意义上而不是在面向对象编程的意义上使用超类型子类型 。)

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”; 他们将改为引用子类型表“任务”和“简要”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM