2012-06-21 34 views
0

下表...:什麼樣的數據模型函數參數和結果?

CREATE TABLE v (
    height int, 
    width int, 
    depth int, 
    volume int, 
    PRIMARY KEY (height, width, depth); 
) 

...可以用來存儲3個變量命名體積的函數的輸入和輸出:volume(height, width, depth) = height * width * depth

我在這裏使用什麼樣的數據模型?它是實體屬性值嗎?

+0

它似乎更像是一個粗略的緩存。 – lanzz

+0

不可以。您正在緩存一項功能。如果只有{h,w,d}的某些組合可以存在,它*可能是一個EAV。 (這與BCNF相似) – wildplasser

回答

2

您似乎是數學導向的。當Codd(Date)引入關係模型時,他(他們)將現有的數學語言重塑到新的領域。

在你的情況:值可能是三個參數的函數:val = f(h,w,d)。但對於「關係」(數據庫表),情況稍有不同:只有在表中實際存在{h,w,d}時纔會定義該函數。在數學中,函數是在整個R3域中定義的。在關係代數中,表({h,w,d})的關鍵是在一個更受限制的域(或者一組域的產物)上定義的。大部分的DBMS/SQL世界都與這些限制有關。 (約束,域約束,無論)UNIQUE約束可能是最基本的約束:它保證至多有一個元組具有特定的{h,w,d}。因此,只有一個功能。 DBMS人員在FK({h,w,d}})上調用關係「功能相關」的非關鍵字段:給定關鍵字集合時,最多可以有一行對應於它「函數值」)

EAV只是一類數據模型,用於「模擬」對象具有可變數量的屬性,而不會改變所涉及的表的定義。但是,在表級別上,它意味着添加一個額外的表(實際上是兩個)屬性和值。數據建模只是變相的拓撲。

0

不,它不是EAV模型。您只需對長方體的尺寸進行建模,並選擇存儲體積。在現實世界中,你可能會包含度量單位和一些檢查約束。

CREATE TABLE v (
    height_cm int not null check (height_cm > 0), 
    width_cm int not null check (width_cm > 0), 
    depth_cm int not null check (depth_cm > 0), 
    volume_cm3 int not null check (volume_cm3 = height_cm * width_cm * depth_cm), 
    PRIMARY KEY (height_cm, width_cm, depth_cm) 
); 

(我曾經未來合作,一個人誰曾與一個關係數據庫/ XML/XSLT,是由一個格式錯誤的委員會設計的怪物來處理的問題。在基於對部分其他的事情,它計算的運費用戶很快就發現他們可以通過簡單地給每個包裝的一個維度設置一個負數來節省運輸成本。)

如果您放棄「volume_cm3」列,表格顯然是在5NF 。 (根本沒有非關鍵屬性。)但是,如果包含「volume_cm3」列及其約束,那麼這是什麼規範形式?仍然在5NF?

0

您顯示的V表只是一個表,它有一個3部分的鍵和一個數據列,完全依賴於密鑰,體積是通過使用三個度量(也可能是其他度量)的公式得出的,函數依賴o f音量是三部分的關鍵。它不是一個屬性值對。它也不違反任何正常形式。它只是一個帶有三部分鍵和一個數據列的派生表。有可能推翻這個問題。

相關問題