RDBMS中適當的規範化意味着表格的擴散。整數字段可以將正交數據存儲爲位 - 這可以用來替代附加表,而不會犧牲關係完整性?按位數學可以用於SQL中的一對多關係嗎?
回答
您的問題的答案是「否」。位字段會犧牲關係完整性,原因很簡單,您的數據庫中沒有相應表的實體。
也就是說,許多數據庫通常通過「比特」數據類型提供對此的支持。 Mysql有更強大的支持,具有「set」數據類型。
主要問題是您不知道集合中的元素 - 什麼是全名,什麼時候被添加到數據庫中,等等。 (枚舉繞過命名問題的一部分。)另外,集合的大小是有限的。你可能有一個事例有限的例子。但是,馬特的例子更強調這裏的問題。你可以有一個大陸訪問的列表。但是,當你轉向訪問的國家時,這種做法必然會有很大的不同,因爲國家的數量不再適合一個「單詞」。你想讓你的系統在這方面與各國大不相同嗎?你是否希望你的設計決定受計算機單詞中32位或64位的限制?
最後,你似乎認爲表的擴散是一個問題。表格的擴散實際上是一種解決方案。所有有關實體的數據都存儲在表中,而不是通過系統分散。您可以維護關於實體實例的信息,例如創建實例的時間,它可能隨時間變化的方式等等。每當有人想要一個大陸時,可能會使用「大洲」實體。
考慮一下系統中發生了什麼,兩個不同的開發人員決定爲大陸開發自己的位掩碼 - 但他們將大陸按不同的順序排列。通過設計良好的關係數據庫(意味着在表定義中明確聲明瞭外鍵關係),就不會出現這種混淆。
對於一對多關係,其中「many」具有少量已知值,可以將關係作爲整數作爲位掩碼存儲在父表中,取代了對額外表的需要。
假設我們有一個表Person,我們想知道一個人訪問過多少個大陸。我們首先將每個Continent分配一個「正交」位值。在C#中,枚舉是一個不錯的選擇:
[Flags]
public enum JobAdvertisingRegion
{
NorthAmerica = 1, // or 1 << 0
SouthAmerica = 2, // 1 << 1
Europe = 4, // 1 << 2
Asia = 8, // 1 << 3
Africa = = 16, // 1 << 4
Australia = 32, // 1 << 5
Anarctica = 64 // 1 << 6
}
Persons表可能只是簡單地有一個名爲Contintents的int列。爲了表明一個人訪問了歐洲和亞洲:
UPDATE Persons SET Continents = (4 + 8) WHERE Id = whatever
要查找誰訪問過南極的人,我們使用按位數學:
SELECT * FROM Persons WHERE Continents & 64 = 64
要查找誰已經訪問了非洲和亞洲的人:
SELECT * FROM Persons WHERE Continents & (16 + 8) = (16 + 8)
要查找誰訪問過澳大利亞或南美人:
SELECT * FROM Persons WHERE Continents & (32 + 2) != 0
一個缺點是,雖然整數列在SQL中是可索引的,但它們的位組件不是。一些優化來解決這個問題,對於上述查詢:
SELECT * FROM Persons WHERE Continents & 64 = 64 AND Continents >= 64
SELECT * FROM Persons WHERE Continents & (16 + 8) = (16 + 8) AND Continents >= (16 + 8)
SELECT * FROM Persons WHERE Continents & (32 + 2) != 0 AND Continents >= 2
好吧,我會去反對(目前)民意在這裏簡單地陳述一些事實
- SQL和關係模型是不同樣的事情。
- 關係模型(理論)的作品有關係的變量,即所謂relvars。
- SQL數據庫使用表。
- 表和relvars是不一樣的,但也可以是 - 所有的實際目的。
- 使用關係建模理論,表格應代表relvars。
對於一個表來表示關係變量下面應該是真實的:
- 行沒有順序
- 列沒有爲了
- 沒有重複的行
- 每一行和列交叉有列定義類型只有一個值
- 沒有特殊的隱藏列(row-id,object id ...)
所以,你可以用表和SQL即出關系設計理論的範圍很多東西,但你失去的「關係」待遇
技術上您的文章(問題)有兩個答案。
- 是,在文章的標題。
- 沒有,到後期的身體。
- 1. Rails中的一對多關係可以創建父對象嗎?
- 2. 一個SQL查詢可以從多對多關係中獲得一行嗎?
- 3. 如何關聯我的對象,以便在Rails中可以將多對多關係用作一對多關係?
- 4. 學說多對多關係
- 5. 關於鏈式一對多關係的學說查詢
- 6. Symfony的2:學說一對多關係
- 7. 學說2一對多的關係
- 8. 核心數據:按對數排序以多對多的關係
- 9. Sql一對多關係
- 10. SQL一對多關係
- 11. SQL一對多關係,但多對一表關係
- 12. Linq-Sql Oracale對象關係數據類型,可以嗎?
- 13. Flask-SQLAlchemy:CircularDependencyError其中多對一關係中的同一行可以與同一表中的一對多關係
- 14. 我可以使ORM一對多關係成爲顯式類嗎?
- 15. 學說2:一對多關係
- 16. Symfony +學說+一對多關係
- 17. Django可以排序多對多的關係嗎?
- 18. 可以排序(order_by)多對多關係的結果嗎?
- 19. UML中的聚合關係可以有一對一的關係
- 20. 多對多的SQL關係
- 21. 學說:額外的關係(多對多)
- 22. 學說2:一對多關係,按外鍵排序
- 23. 使用SQL插入一對多關係
- 24. 用SQL定義一對多關係
- 25. 一個關係可以在多個外鍵的3NF中嗎?
- 26. 用SQL只計算一對多關係中的子記錄數
- 27. 一對多和一對一關係的學說yaml
- 28. 我可以在Ember.js的一側建立多對多的關係嗎?
- 29. 以多對多和一對多的關係訪問數據
- 30. 用於一對多/多對一關係的休眠設置
我同意。我想補充一點,您可能會通過自己動手的按位字段方法損失查詢清晰度。清晰簡潔在非平凡系統中非常重要。 – smv 2012-08-02 18:21:37