2016-11-10 57 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:这里的嵌套深度非常小。一般来说,如果您可以使用嵌套列表表示层次结构,那么只要每个项目都有一个关键字段,就可以使用嵌套字典来完成。 –