我有一個列表,其中每個列表條目都標記了多個標記。每個標籤也可以有子標籤。列表中的每個條目都可以有多個標籤。存儲分層標記的最佳方法
例如,關於汽車的列表條目可以具有稱爲「汽車」,「車輛」,「法拉利」的標籤。
我應該可以查看標籤層次結構,如下所示。此外,每個條目的標籤數量應該沒有限制,並且標籤可以有多深。
如何存儲此數據?我願意使用任何類型的DBMS。
我有一個列表,其中每個列表條目都標記了多個標記。每個標籤也可以有子標籤。列表中的每個條目都可以有多個標籤。存儲分層標記的最佳方法
例如,關於汽車的列表條目可以具有稱爲「汽車」,「車輛」,「法拉利」的標籤。
我應該可以查看標籤層次結構,如下所示。此外,每個條目的標籤數量應該沒有限制,並且標籤可以有多深。
如何存儲此數據?我願意使用任何類型的DBMS。
幼稚的方法是父母/孩子的解決方案,但用這種數據模型編寫高效的查詢非常困難。
Managing Hierarchical Data in MySQL是一篇關於分層數據結構的不錯文章。我想大多數它也可以應用於其他數據庫系統。
感謝您的鏈接!非常豐富。 – ashwnacharya 2011-06-14 15:22:06
這個想法很整潔,但我想知道如果整個層次結構隨着時間的推移而變得多麼容易。 – EFreak 2018-02-14 08:03:31
使用XML格式,這將有助於您在存儲爲家長和孩子 它可以有節點的n個容易形成和處理的節點。 注意:下面的例子只是一個例子,所以通過這種方式你可以處理數據。
<Menu>
<Menuitem1>
<submenu1>
<submenu1>
<submenu1.1/>
</submenu1>
</submenu1>
</Menuitem1>
<Menuitem1>
<submenu1>
</submenu1>
</Menuitem1>
</Menu>
我認爲這可能會對您有所幫助。
如何將每個項目鏈接到列表中的條目?我也需要存儲列表條目。 – ashwnacharya 2011-06-14 14:59:12
我認爲這是任何數據庫的最簡單的方法: tag (id, name, parent_id)
,其中parent_id
是指id
的父標籤。
您正在使用2個數據源,但似乎您正在混合兩者。
一個數據是您的列表條目,似乎是線性的,非分層的。
例如,電影列表。
數據的另一個來源,其分層數據的集合(「標籤目錄」)。
例如電影風格列表。
+---Styles +---Comedy +---KidsComedy +---SomeComedy +---LOLComedy +---Action +---SomeAction +---GrabYourCouchSofaAction +---Drama +---SomeDrama +---LotsOfTearsDrama +---EvenToughGuysWillCryDrama +---Horror +---SoftHorror +---HardHorror +---Gore +---SciFi
每個動畫可與多種電影風格有關:
在數據庫設計方面,你應該有unleast 3個表或實體對象:
祝你好運。
是的。感謝您花時間瞭解我的問題。對不起,如果它不早。 – ashwnacharya 2011-06-14 18:50:16
這就是我將如何處理這個問題:首先,我將繪製一個領域模型。在你的情況下,它看起來像:
List(1)----contains----(0..*)-->ListItem
ListItem(0..1)----hasTags--(0..*)-->Tag
Tag(0..1)-----hasSubTags---(0..*)-->Tag
這使問題明確留下不容置疑的餘地。
現在,將其轉換爲數據模型。這非常簡單:爲每個關係引入合適的PrimaryKey-ForeignKey映射。多對多關係應該使用中間的新表格拆分成兩個1-M關係。
您在此階段擁有的數據模型在功能上應該是正確的,但可能存在性能問題。現在是您專注於您需要的查詢並相應地優化表結構的時候了。
(另一個類似的細化行程從域模型開始會給你最終的類模型的設計以及)
希望這種方法幫助。
請參閱my answer here。我存儲所有級別的父母 - 樹木建築和查詢所有後代非常簡單。
NoSQL數據庫怎麼樣? – 2013-09-30 13:21:13