【发布时间】:2010-11-20 02:30:28
【问题描述】:
我将很快开始一个项目的工作,该项目(根据规范)让我想起了 StackOverflow。基本上,它是一个具有用户控制内容的网络应用程序。
让我在脑海中转来转去的功能之一是版本控制。在 StackOverflow 上,每个问题和答案都可以有多个修订。当您只有一种类型的对象(在本例中是它的文本)时,这很容易实现。
所以,对于我的简单页面,我准备好了。
当我认为某些需要受版本控制的对象具有关系时,问题就出现了。为了提供一个具体的例子,让我选择一个随机的类比域:
假设我正在实施一个类似于 Wiki 的网站来跟踪书籍/作者信息。 该站点的主要重点是创建和更新“作者”页面,作为文本,这些页面非常简单(如上所述)。然而,让我们在作者和书籍之间添加一个一对多的关联(换句话说,书籍将是单独的对象,因为显然一个人可以编写许多书籍)。每本书都有一个从作者页面到关于该书的信息页面的链接。
对于用户而言,描述作者的基于文本的“摘要”与该作者与其作品之间的链接几乎没有区别。因此,我们需要为作者页面、书籍页面以及和作者与书籍之间的关联实现“修订”/编辑功能。换句话说,用户应该能够编辑、查看历史记录和回滚作者页面、书籍页面以及两者之间的关联。
当这种关系变成多对多时,情况会变得更加复杂,其中可以将多个作者列为对一本书的贡献。
我想到了许多解决方案,但没有一个像我想要的那样干净(并且至少涉及一些重复的代码/冗余数据存储),尽管我确实在这里看到了共同点,我觉得我还没有真正能够最好地提取它,尤其是在数据库级别。我不想对给出的答案产生偏见,所以我不会马上给出。
那么,您将如何在数据库级别设计此系统? 我正在这里寻找表规范,如果不是很明显的话,可能还有关于如何使用它们的描述。对于那些可能相关的答案,我将使用 ASP.NET 和 Linq-to-SQL(我对 LTS 中的多对多感到满意)或实体框架。
编辑:澄清一下,我了解基本的数据库设计、规范化、多对多映射表等。我正在为这种特定情况寻找一个干净的解决方案。
编辑 2: 我正在寻找一个通用的解决方案,因为系统中可能有更多的子对象,而不仅仅是书籍。作者可能与其他作者、杂志、事件等有关。如果我为每个作者单独实现历史,我觉得我正在重复很多工作。
【问题讨论】:
-
@JoshJordan:不要道歉。修正问题,使其更切中要害。
标签: asp.net linq-to-sql database-design normalization