2010-03-12 48 views
1

我有一個有兩個子表的表。對於父表中的每條記錄,我希望在其中一個子表中有一個且只有一個記錄 - 每個記錄中都不是一個,也不是一個。我如何定義?保證孩子記錄在一張桌子或另一張桌子上,但不是兩個?

這是背景故事。隨意批評此實現,但請回答上面的問題,因爲這不是我遇到它的唯一時間:

我有一個數據庫,其中包含有關用戶調查的數據。它最初設計有一種用於開始調查的認證方法。從那時起,需求已經發生了變化,現在有兩種不同的方式可以簽署開始調查。

本來我在調查表中的一列中捕獲了認證令牌。由於需求發生變化,我想在驗證中捕獲另外三個數據位。因此,對於調查表中的每條記錄,我要麼有一個令牌,要麼有一組令牌。所有這四種類型都是不同的類型,所以我的想法是,而不是有四列,其中任何一個將是空的,或者三個將是空的(或者更糟糕的是,這些場景中的任何一個都不好混搭),我會有兩個子表,一個用於保存單個身份驗證令牌,另一個用於保存三個。問題是,我不知道如何在DDL中定義它。

我正在使用MySQL,所以也許有一個功能,MySQL並沒有實現,讓我這樣做。

回答

1

有多種方法可以實現這個

布爾標誌邏輯

你可以有一個布爾標誌ParentTable稱爲ChildTableDataInserted如果行插入任何一個表,你可以更新爲TRUE 。如果ChildTableDataInserted爲False,則只插入到子行中。這當然取決於所有使用您創建的存儲過程的插入,並且很容易被違反,但數據庫的開銷很小。

觸發器

將一個BEFORE INSERT上的數據插入到兩個子表的,如果你的故障條件滿足,就可以提高用於插入一個錯誤。

我個人避免觸發器,除非我絕對沒有其他選擇,這似乎是一個實施觸發器的好地方。

瞭解更多關於觸發這裏

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

+0

啊!觸發器是我從未使用過的東西。這是一種沒有其他選擇,只有觸發器的情況嗎?你會怎麼做我想做的事? – user151841 2010-03-12 15:23:36

+2

我會考慮違反第三範式並將4列放在一張表中。 – 2010-03-12 16:35:19

+0

實用性勝出,Raj :) – user151841 2010-03-15 18:09:17

相關問題