2009-08-21 136 views
3

我有很多對象,每個對象都可以有很多不同類型的屬性。許多屬性重疊,例如,許多對象具有「名稱」屬性。 由於有很多類型的對象,如果爲每個具有相同屬性集的對象集構造一個表,它將佔用很多表。在數據庫中存儲對象

目前我使用的是一個mysql,它以這種方式存儲。

object_id|attribute_id|data 

有幾個這樣的表,不同的表有不同類型的數據。 例如,在整數表中,它只存儲整數

因此,我可以將所有類型的對象存儲在系統中,並且仍然可以根據屬性的數據進行過濾和排序。它使查詢有點複雜,我不認爲它是有效的。

這是在mysql或其他關係數據庫中做的唯一方法嗎? 我應該嘗試爲這個問題找到其他數據庫模型嗎?

編輯 我做了一些研究,看來我需要的是一個具有SQL功能的面向文檔的數據庫。

回答

5

如果你想要去一個RDBMS般的面向文檔的數據庫,我想你應該考慮mongoDB

的MongoDB的一個主要目標是縮小鍵/值存儲之間的差距 (其中 是快速和高度可擴展的)和 傳統的RDBMS系統(其功能深度是 )。

+0

MongoDB的另一個好處就是它可以直接適用於您的情況,因爲您可以擁有在一個集合中類似但不相同的所有不同類型的對象(類似於MySQL中的表)。如果您使用像Doctrine這樣的良好ORM,它甚至可以自動區分對象的類型,並在PHP中從數據庫加載它們時將它們轉換爲正確的對象。不知道你使用的是什麼語言,但我敢打賭,如果它不是PHP,就會有類似的東西。 – cjroth 2011-02-04 02:36:07

5

我想你想要做的是研究稱爲「對象關係映射」的區域。這是一個有很多解決方案的大區域。有些用於框架,比如Rails中使用的ActiveRecord。

0

使用一個表是可能的,並且可能是優選的。爲所有對象類型的每個屬性都有一個表列。然後再添加一列以指示「對象類型」。您可以通過查詢具有特定對象類型名稱的行的簡單查詢,從表中找出一種類型的所有對象。

+0

如果空間不是問題並且只有少數幾個不同的屬性,那麼這將起作用。 雖然空間不是問題,但有很多屬性(可能有數百個)。像mysql這樣的數據庫對行的存儲量有限制,因此不可能。 – 2009-08-21 01:29:32

0

使用ORM(這是一個非常好的主意)的替代方法是改爲使用語言的內置序列化功能(如果它有一個,而不是庫)將對象轉換爲字節緩衝區,並將其存儲在數據庫中,並使用合適的密鑰來查找它。這對於memcached等鍵值數據庫非常有效。

+0

這是一個好主意。但是這消除了關係數據庫的真正好處。如果不需要過濾和排序,顯然這是最好的做法(事實上,像東京內閣這樣的關鍵/價值數據庫已經足夠好了)。但是我需要找到屬性x大於10的所有對象。這種設計需要系統將所有對象讀入內存並過濾這些對象。 – 2009-08-21 02:05:27

4

您的設計被稱爲對象屬性值(OAV)。這是將對象映射到關係數據庫的一種方法。它通常非常緩慢,但非常靈活。如果你的類定義不斷變化(或動態變化),這可能是你唯一的選擇。

您可以使用對象關係映射(ORM)。這是另一種將對象創建到關係數據庫的方法。它速度更快,並且稍微不靈活。如果您的類定義不會經常更改(並且不會動態更改),那麼這是一個更好的選擇。