簡體   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