我有一個查找表,我們插入組合的值,如情況12和20. 我很擔心它,但我不確定這是否是一種不好的做法。那麼這怎麼會有害呢?組合查找表 - 數據庫設計
PK.........Name
1.............A
2.............B
4.............C
8.............D
12............C&D
16............E
20............C&E
我有一個查找表,我們插入組合的值,如情況12和20. 我很擔心它,但我不確定這是否是一種不好的做法。那麼這怎麼會有害呢?組合查找表 - 數據庫設計
PK.........Name
1.............A
2.............B
4.............C
8.............D
12............C&D
16............E
20............C&E
從描述中無法確切地說明問題是什麼。但是,如果名稱列包含任何不只是一個名稱的值,那麼您的設計違反了規範化規則。
在您的示例中,唯一性定義會變得模糊,您如何判斷列表中是否存在重複(E,C & E,E & C,C)?是(C & E)與(E & C)相同嗎?
對您的示例進行擴展,假定Name列與標題組合在一起,那麼查找「Alex」和「Mrs」可能會很困難。例如,你將如何編寫查詢?這是否像「麥酒太太」或「亞歷克斯夫人」 - 如果有人有'太太'的名字,但實際上是一個先生?那麼柱分離器呢?
如果無法進行準確的查詢,那麼更新也會導致問題。將(C & E)更新爲(C)或(E)的值是否有效?您可以運行查詢將所有(C & E)更改爲(C & D)?如果(C & D)已經存在,你會允許(C & D & D)在這種情況下?
說了這麼多之後,在某些情況下,這種設計可能會正常工作,特別是當兩個連接列都是強制性的並且數據嚴格用於查找時(例如,簡單的Contact-us表單中的Country-State),但我個人不會不贊成,因爲沒有從中獲得真正的價值。
取決於值是否如C
,D
和E
應從數據管理的角度來看原子。
例如,對於PK = 12,是否需要獨立於C
(反之亦然)查詢或修改D
?如果是的話,存儲D
內C&D
違反atomicity原則,因此1NF,在這種情況下,你應該將表拆分爲1:N的關係:
「1」 表:
ID
--
12
「N」表({ID,Name}是關鍵):
ID Name
-- ----
12 C
12 D