有兩種方法可以解決您的問題:一個列數據庫,如Cassandra;或關係中的名稱 - 值對(也稱爲屬性值對)。
首先,Cassandra是一個結構化的鍵值存儲。一個鍵可以包含多個和可變的屬性和值。值或列分組爲列族。創建Cassandra數據庫時,列族已修復。一個家族類似於邏輯數據模型中的實體或關係中的表。列可以隨時添加到家庭中。因此,列家族的不同實例可以有不同的列,這就是你需要的。此外,列被分配給指定的鍵,因此不同的鍵在任何給定的家族中可以具有不同的列數。
可以在邏輯數據建模和關係中創建名稱值對,也稱爲屬性值對。這可以通過三個相關的實體或表來完成:
- 基本實體(如客戶),其類似於一個列族。
- 一個「類型」實體,它描述屬性及其特徵,如淨值金額,
- 「值」實體,它將該屬性分配給基礎實體的實例併爲其分配值。
「類型」實體只是一個由類型代碼標識的代碼表,其中包含描述和其他域特徵。域指數據類型,長度,含義和度量單位。它描述了脫離上下文的屬性(即未分配)。一個例子可能是淨值金額(8位數字,小數點後兩位),右對齊,其描述是「代表客戶的總體財務價值的數值,包括液體和非液體數量」。
「價值」實體是由客戶ID和屬性類型代碼標識的關聯實體或表,並具有一個值屬性,用於爲客戶分配淨值金額類型併爲其提供值,例如「$ 2,000,000。」
但是,在關係名稱 - 值對中,在SQL中查詢有點困難,並且通常性能不佳。這可以通過將「類型」和「價值」實體非規範化爲一個來解決。而不是有三個表,你有兩個 - 一對多。實際上,Cassandra基本上是這麼做的。一個列族是一個完全展平的屬性 - 值對。
我希望這會有所幫助。如果你打算使用NOSQL,我會使用類似Cassandra的東西。如果你使用關係型,我會反規範化(即合併成一個)類型和值。關係的優點是你已經擁有了它。卡桑德拉的缺點是你必須學習它,但它是按照你想要的來構建的。