c# - 模型设计为数据库表还是多维列表?

标签 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; }
}

很明显,表设计中存在大量的内存浪费(因为有重复的数据)。每个条目的版本都相同,大多数条目将重复本书,较少条目将重复章节。对于每个记录,只有诗句和文本是唯一的。另一方面,这就是数据库永远工作的方式(除非你走关系路线)。抓取数据 super 容易。

列表设计:

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 是否也适用于多维(也许它很棒,但我只在平面数据上使用过它)。

大家怎么看?是否有时每一个都是一个明显的选择,或者一个总是将成为默认选择?

最佳答案

第二个是所有默认操作的更好选择。您的表构造就是这样,一个平面表。它缺少所有数据库功能,例如使用索引进行快速查找。

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

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

关于c# - 模型设计为数据库表还是多维列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40531028/

相关文章:

c# - ThreadPool.QueueUserWorkItem 用例

java - 在Java中我们如何称呼类的实例

jQuery - 为什么通过字符串 ($ ('<div class="foo"/>')) 创建类对象比创建相同对象并执行 addClass() 方法慢?

c# - Linq 的 Enumerable.Count 方法检查 ICollection<> 但不检查 IReadOnlyCollection<>

c# - 如何使用 lambda 表达式和匿名类型获取类型的属性名称?

c# - 包含路径表达式必须引用 type.in 预加载中定义的导航属性

c++ - 运算符无故更改类的参数 (*int)

c# - AUTOINCREMENT 不适用于 OleDbCommand

c# - 如何使用 Newtonsoft.Json 将对象序列化为带有类型信息的 json?

c# - 解析具有相同父节点和子节点名称的 XML