模型设计作为数据库表还是多维列表?

时间:2016-11-10 15:17:44

标签: c# linq class data-structures

我正在处理一组数据(圣经),以及重复的字段(书籍,章节等等),并试图决定如何构建它。

以下是我正在研究的两种设计的示例。是否比另一个更有用/更合适/更有益?

表设计:

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是否也能正常工作,具有多维度(可能很棒,但我只在平面数据上使用它)。

你们觉得怎么样?是否有时候每个人都是明显的选择,或者总是将其作为默认选择?

3 个答案:

答案 0 :(得分:3)

第二个是所有默认操作的更好选择。你的表构造只是一个平面表。它缺少所有数据库功能,例如快速查找索引。

在第二个版本中,您可以找到一本书,然后在其中包含所有章节。在表格版本中,无论您做什么,都必须横向整个数据结构。

表格版本有冗余数据,而使用起来较慢。对于真实的数据模型来说,这似乎是双赢的。

答案 1 :(得分: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"];

这是一个可能的内存组织,但不一定是最好的。&#34;事实上,&#34;最好的&#34;在很大程度上取决于你想如何使用它。如果您总是按照Book:Chapter:Verse查找内容,那么这非常好,因为查找速度非常快。使用List组织,您必须执行顺序扫描以查找特定Book,然后扫描其章节列表,最后扫描Verses列表。

但是,如果你想按顺序呈现一切,那么词典组织就不是那么好了。您需要一个单独的索引来保存书籍,章节和诗歌的顺序。

那只是内存组织。您希望如何保留信息是另一个问题。您可以使用规范化数据库,这将使查询非常方便。或者您可以将分层的Dictionary或List组织存储在文本文件中。这实际上取决于您将如何使用这些数据。没有普遍的&#34;最好的&#34;解决方案。

答案 2 :(得分:0)

  • 我不知道哪个&#34;表设计&#34;你提到,但它本身看起来不像是与数据库有关的设计。

  • 您所指的&#34;列表设计&#34;实际上看起来像NoSQL文档架构。您应该看一下MongoDB,它支持这些开箱即用的模型,并且具有非常丰富的.NET驱动程序。

  • 至于你的问题,我肯定会选择第二种设计。请注意,您目前的设计将为您提供糟糕的性能,因为它需要加载每本书,这本身就是昂贵的。考虑&#34;嵌入与引用&#34; (关于文档数据库)并选择更合适的模型。

    对于其中一个,我只会将一个章节加载到内存中,并附带其经文 - 因为它是您可以在UI上显示的最基本的信息单元。