簡體   English   中英

數據庫設計。 是否具有傳遞依賴性?

[英]A database design. Transitive dependency or not?

我花了很長時間(超過一年)從數據庫設計中休息,我剛剛回來。 我正在為我正在創建的網站設計一個數據庫。 我在一個表中存儲2個布爾值(兩個單獨的列)。 我意識到,如果第一個值為真,另一個值也將始終為真,但如果第一個值為假,則另一個值可以為真或假。 就我而言,這不是一個傳遞依賴,我不應該創建一個新的表,但我想確保我做的一切正確。 如果有多個值的行為類似於第二個布爾值,我仍然會將它保存在同一個表中嗎? 在數據庫中存儲此類數據的最佳方法是什么?

如果anwser包含ER圖,我將不勝感激。

標准化:
我認為我們應該區分兩種情況:

  • 布爾值序列的最大長度== 2;
  • 布爾值序列的最大長度> 2;

第一種情況可以使用帶有兩個字段的單個表來解決,因為它保證了良好的性能和空間優化(除了忽略規范化規則之外,你不能比這種方式節省更多的空間,我在最后一個中做了解):

MyBools (id, firstBool, secondBool);


關於第二種情況,我提出了兩個想法,其中沒有一個我很滿意。
我們可以說的主要是,當你有很長的序列時,每個布爾值的列都不是很方便。 這是我的兩個想法:

  1. 帶有PK的單個表,一個布爾字段和一個自引用外鍵:

     MyBools (id, thisBool, idNextBool); 

    thisBool顯然包含一個布爾值。 如果thisBool為true,那么您就不需要存儲以下布爾值,因為它的值與第一個值匹配。 如果thisBool為false,則idNextBool指向以下布爾值。
    此解決方案僅允許向前搜索。

  2. 帶有PK的單個表,一個布爾值和一個自引用外鍵:

     MyBools (id, thisBool, idNextBool); 

    如果idNextBool為null,則表示您已達到序列的第一個值。 否則idNextBool指向以下布爾值。
    此解決方案僅允許向后搜索。

正如您所看到的,第二種情況的解決方案(序列超過2個值)相當難以管理。
這就是我提出非標准化解決方案的原因。


未規范化:
您可以將這些布爾值視為數字字段的位(特別是考慮到布爾值實際上由一個位表示)。 假設我們有兩個字段field1field2 ,並考慮我們可以將它們放在一個字段中(讓我們稱之為myfield ):

1) IF field1 is True THEN field2 True         myfield = 0


                                   __ True      myfield = 10
2) IF field1 is False THEN field2 /
                                  \__ False       myfield = 11

正如您所看到的,您可以將此擴展為盡可能多的布爾值,因為您可以將其放入數字字段內(例如,在32位數字字段中,您可以存儲32個布爾值,只要每個布爾值取決於較低的值)。

它不是函數依賴,因此它不是傳遞函數依賴。

根據定義 ,X - > Y當且僅當每個X值恰好與一個Y值相關聯時。

在你的情況下,當X為假時,Y可能是以太真或假,所以上面的定義不成立。


它確實看起來像一個多值的依賴。

除了添加適當的CHECK約束之外,我不確定你應該做些什么(復雜事情的成本會因預期的收益而變高)。

我想到了一個解決方案,但我不知道它是否有任何好處。 如果第一個值為false,我可以使用FK為所有其他值創建另一個表,如果值為true則存儲其他值我可能不會為這些值生成表,因為它們都將是真的無論如何

你的問題有點模糊,但我會試一試。 首先,根據您的描述,您沒有傳遞依賴。 原因是,當傳遞依賴需要三個屬性存在時,你只提兩個,我假設你的表是屬性。

當A暗示B時存在傳遞依賴,而B暗示C.換句話說,A意味着C傳遞過B.

無論如何,我認為尋找具有小數據樣本的功能依賴性而沒有上下文導致糟糕的數據庫設計。 你桌子里的元素是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM