2016-11-10 97 views
1

我正在與一組數據(聖經),經常性字段(書,章等),並試圖決定如何構造它。模型設計作爲數據庫表或多維列表?

這是我正在看的兩個設計的一個例子。比另一個更有用/合適/有利嗎?

表設計:

class Bible 
{ 
    public string Version { get; set; } 
    public string Book { get; set; } 
    public int Chapter { get; set; } 
    public int Verse { get; set; } 
    public string Text { get; set; } 
} 

顯然,在表中設計了很多浪費的內存(因爲重複數據)。每個條目的版本都是相同的,這本書將在大多數條目中重複,該章節將重複以減少條目。只有經文和文本對每個記錄都是唯一的。另一方面,這就是數據庫如何永久運行(除非你要去關係路線)。抓取數據非常簡單。

列表設計:

class Verse 
{ 
    public int Number { get; set; } 
    public string Text { get; set; } 
} 
class Chapter 
{ 
    public int Number { get; set; } 
    public List<Verse> Verses { get; set; } 
} 
class Book 
{ 
    public string Name { get; set; } 
    public List<Chapter> Chapters { get; set; } 
} 
class Bible 
{ 
    public string Version { get; set; } 
    public List<Book> Books { get; set; } 
} 

這是更爲簡潔,從內存待機點,但你必須爲foreach,你需要找到一切。我不確定LINQ是否也適用於多維度(也許它很棒,但我只在平面數據上使用過)。

你們認爲什麼?有時每個人都是明智的選擇,或者總是成爲默認選擇?

+1

你可能得不到一個好的答案,因爲這可能會被認爲是基於觀點的,但是你的列表設計似乎是正確的方式,Linq的效率非常高! –

+0

如何存儲數據以及如何呈現它實際上是兩個不同的問題。我會堅持使用第三種正常格式來存儲數據。使用Linq進行查詢並且無論如何需要使用它來投影數據都很簡單快捷。 – axlj

+0

做一些關於數據標準化的閱讀。您將很快拒絕選項1. –

回答

3

第二個是所有默認操作的更好選擇。你的表格結構就是這樣一張平坦的桌子。它缺少所有數據庫功能,如使用索引進行快速查找。

在第二個版本中,您可以找到一本書,然後在其中包含所有章節。在表格版本中,無論你做什麼,都必須橫跨整個數據結構。

表格版本有冗餘數據使用較慢。看起來像真正的數據模型的雙贏。

+0

我正在學習面向對象編程的過程,我的大腦繼續回到我所知道的事情(如數據庫)。這似乎是'List '更好,但更難以合作。 – doubleJ

0
  • 我不知道你引用了哪個「表格設計」,但它看起來不像是一個與數據庫本身有關的設計。

  • 你稱爲「列表設計」實際上看起來像一個NoSQL文檔模式。你應該看看MongoDB,它支持開箱即用的模型,並且有一個非常充足的.NET驅動程序。

  • 至於你的問題,我肯定會與第二個設計,第一個。請考慮到你現在的設計會給你提供很差的性能,因爲它需要加載每本書,這本身就是昂貴的。考慮「嵌入與引用」(與文檔數據庫相關)並選擇更適合的模型。例如,我只會將一章加載到內存中,並以它的經文完成 - 因爲它是您可以在用戶界面上顯示的最基本的信息單元。

1

的替代到您的列表設計是使用字典:

class Verse 
{ 
    public int Number { get; set; } 
    public string Text { get; set; } 
} 
class Chapter 
{ 
    public int Number { get; set; } 
    public Dictionary<int, Verse> Verses { get; set; } 
} 
class Book 
{ 
    public string Name { get; set; } 
    public Dictionary<int, Chapter> Chapters { get; set; } 
} 
class Bible 
{ 
    public string Version { get; set; } 
    public Dictionary<string, Book> Books {get; set;} 
} 

現在有沒有foreach找一本書。相反,你可以用名字來引用它。也就是說,假設你有一個Bible參考,你想創世記:「最好的」

Book genesis = myBible.Books["Genesis"]; 

這是一個可以在內存中的組織,但不一定事實上,「最好的」在很大程度上取決於你想如何使用它。如果你總是用Book:Chapter:Verse來查找,那麼這非常好,因爲查找速度非常快。使用List組織,您必須執行順序掃描才能找到特定的書籍,然後掃描其章節列表,最後掃描Verses列表。

但是,如果您想按順序呈現所有內容,Dictionary組織並不是那麼好。你需要一個單獨的索引來保存書籍,章節和詩歌的順序。

而這只是內存中的組織。你想如何堅持信息是另一個問題。你可以使用規範化的數據庫,這將使查詢非常方便。或者您可以將分層字典或列表組織存儲在文本文件中。這實際上取決於你將如何使用數據。這裏沒有通用的「最佳」解決方案。

+0

我看過字典,但沒有嵌套。本書的意圖是一個主/細節用戶界面,其中一系列章節在主頁中呈現。用戶點擊章節參考,並且詳細列出經文列表。 – doubleJ

+0

@doublej:這裏的嵌套深度非常小。一般來說,如果您可以使用嵌套列表表示層次結構,那麼只要每個項目都有一個關鍵字段,就可以使用嵌套字典來完成。 –