簡體   English   中英

良好的數據庫設計,可變數量的屬性

[英]Good database design, variable number of attributes

我正在嘗試創建一個包含設備列表的數據庫。 所有設備都具有某些共同屬性(例如制造商,型號#,序列號等),然后還有其他特定於某個設備的屬性(即,調制解調器將具有訪問權限#,而太陽能電池板將具有輸出容量)。 我不確定如何用良好的數據庫設計原則來表示這些不斷變化的屬性,我嘗試過在網上搜索,但我並不完全確定要搜索什么。

我想出了以下可能的解決方案以及我對它們的初步想法:

  1. 有一個包含每個可能屬性的大表,只需將null放在不適用的地方。 顯然這有一些缺陷。

  2. 為每種設備類型單獨設置一個表。 這似乎可能是一個噩夢,如果我想打印所有設備的列表,我怎么知道要查找哪些表?

  3. 有一個包含公共屬性的表,以及使用外鍵訪問的每個設備類型的其他表來存儲額外的屬性。 我可能會做這個工作,但它會很麻煩,只是感覺不是一個很好的解決方案。

  4. 實體 - 屬性 - 值類型模型。 只是看起來不太適合我想做的事情。

我沒有很多數據庫的經驗,所以我在學習這里,任何與此問題相關的鏈接或“必讀”數據庫設計的文章都將受到贊賞。 謝謝!

編輯:首先,我發現我需要谷歌“繼承映射”,這可能會幫助其他有類似問題的人。 為了解決這個問題,我最終使用了#2和#3的混合體。 它實際上非常簡單,運行良好,並且解決了在沒有EAV復雜性的情況下添加額外設備類型的問題。 感謝所有的意見和建議!

選項1,2和3共享一個非常嚴重的缺陷:當有人夢想新屬性時,您必須修改基礎表模式。 在備選方案1的情況下,引入新設備類型的可能性使問題更加復雜。 你有多確定這組屬性是否一直都是固定的? 您是多么高興能夠停電或告訴客戶不,您不能擁有新的屬性?

如果您很可能對常見屬性進行查詢,則可以嘗試使用3和4的混合,在屬性類型而不是設備類型上分割時會出現短划線2,這似乎更不穩定。 如果我理解正確,選項4是選項1的正常形式版本,它解決了所有固有問題(稀疏性和脆弱性)。

INVENTORY( id*, model, manufacturer, serial )
ATTRIBUTE( id*, name, type, description )
INVENTORY_FACT_STRING( inv_id*, attr_id*, value )
INVENTORY_FACT_NUMBER( inv_id*, attr_id*, value )
INVENTORY_FACT_LIST_STRING( inv_id*, attr_id*, ordinal*, value )

等等

Martin Fowler在他的一本書和他的網站上概述了備選方案1,2和3。

單表繼承(選項1)

具體表繼承(選項2,排序)

類表繼承(選項3)

我傾向於選項3.每個人都有其在一般方案中的地位。

EAV可以很好地動態添加新屬性。 但是,當需要將數據轉換為有用的信息時,EAV數據庫可能是一場噩夢。

我有一個更長的答案,我將按要求發布。

我認為你面臨着常規的數據庫規范化。 您需要以下表格:

Items -> Id, Name, Model, Brand Id
Brands -> Id, Name
Attribute Names -> id, name
Attribute Mappings -> Id, Names Id, Items Id, Attribute Description

如果有多個Attribue,請在屬性表中列出並與Product Id等關聯。嘗試提出第3個規范化表單

數據庫規范化

解決任何SQL數據庫都是一個難題。 MySQL沒有很好的答案。

1)工作,您可以為重要的設備類型添加一些視圖。 它減少了連接數,並允許每個字段上的查詢和索引。

2)您可以在視圖中使用union all查詢。 PostgreSQL和Informix具有表繼承。

3)這通常是一種實現選擇。 同樣,您可以使用視圖進行連接。

4)PostgreSQL,Informix,Oracle,IBM DB2和MS SQL Server都支持XML數據類型來實現值對。

在更高級別,您可以使用XML開發設備的元模型。 然后,您可以使用此模型生成模式SQL查詢和CRUD代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM