我正在处理一组数据(圣经),以及重复的字段(书籍,章节等等),并试图决定如何构建它。
以下是我正在研究的两种设计的示例。是否比另一个更有用/更合适/更有益?
表设计:
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是否也能正常工作,具有多维度(可能很棒,但我只在平面数据上使用它)。
你们觉得怎么样?是否有时候每个人都是明显的选择,或者总是将其作为默认选择?
答案 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上显示的最基本的信息单元。