我即将开始一个项目,从规格上看有点像StackOverflow。基本上,这是一个具有用户控制内容的Web应用程序。
其中一个让我困惑不已的功能是版本控制。在StackOverflow上,每个问题和答案都可以有多个修订版本。当你只有一种类型的对象(在这种情况下是文本)时,这很容易实现。
所以,对于我的简单页面,我已经设置好了。
但是,当我考虑需要进行版本控制的某些对象具有关系时,问题就出现了。为了提供一个具体的例子,让我们选择一个随机类似的领域:
假设我正在实施一个类似Wiki的站点来跟踪书籍/作者信息。该站点的主要重点将是创建和更新“作者”页面,这在文本方面非常简单(如上所述)。但是,让我们在作者和书籍之间添加一个一对多的关联(换句话说,书籍将是单独的对象,因为一个人可以撰写多本书)。每本书都将从作者页面链接到有关该书的信息页面。
对于用户而言,在描述作者的基于文本的“摘要”和作者与其作品之间的链接之间几乎没有区别。因此,我们必须实现作者页面、图书页面和作者与书籍之间的“修订”/编辑功能。换句话说,用户应该能够编辑、查看作者页面、书籍页面和两者之间的关联历史记录,并回滚。
当这种关系变成多对多时,情况会变得更加复杂,因为多个作者可能被列为为一本书做出贡献的作者。
我有许多解决方案,但没有一个像我想要的那样干净(并涉及至少一些重复代码/冗余数据存储),尽管我确实在这里看到了共性,但我感觉我还没有真正能够最好地提取它,特别是在数据库层面上。我不想影响给出的答案,所以我不会立即给出答案。
那么,在数据库级别上,你会如何设计这个系统?我在这里寻找表规格,如果不是显而易见的话,可能还需要描述如何使用它们。对于那些可能相关的答案,我将使用ASP.NET和Linq-to-SQL(我熟悉LTS中的多对多)或Entity Framework。
编辑:澄清一下,我了解基本的DB设计、标准化、多对多映射表等。我正在寻找这种具体情况的简洁解决方案。
编辑2:我正在寻找通用解决方案,因为系统中可能会有比书籍更多的子对象。作者可能与其他作者、杂志、事件等相关联,我感觉如果我为每个人单独实现历史记录,我就要重复很多工作。
其中一个让我困惑不已的功能是版本控制。在StackOverflow上,每个问题和答案都可以有多个修订版本。当你只有一种类型的对象(在这种情况下是文本)时,这很容易实现。
所以,对于我的简单页面,我已经设置好了。
但是,当我考虑需要进行版本控制的某些对象具有关系时,问题就出现了。为了提供一个具体的例子,让我们选择一个随机类似的领域:
假设我正在实施一个类似Wiki的站点来跟踪书籍/作者信息。该站点的主要重点将是创建和更新“作者”页面,这在文本方面非常简单(如上所述)。但是,让我们在作者和书籍之间添加一个一对多的关联(换句话说,书籍将是单独的对象,因为一个人可以撰写多本书)。每本书都将从作者页面链接到有关该书的信息页面。
对于用户而言,在描述作者的基于文本的“摘要”和作者与其作品之间的链接之间几乎没有区别。因此,我们必须实现作者页面、图书页面和作者与书籍之间的“修订”/编辑功能。换句话说,用户应该能够编辑、查看作者页面、书籍页面和两者之间的关联历史记录,并回滚。
当这种关系变成多对多时,情况会变得更加复杂,因为多个作者可能被列为为一本书做出贡献的作者。
我有许多解决方案,但没有一个像我想要的那样干净(并涉及至少一些重复代码/冗余数据存储),尽管我确实在这里看到了共性,但我感觉我还没有真正能够最好地提取它,特别是在数据库层面上。我不想影响给出的答案,所以我不会立即给出答案。
那么,在数据库级别上,你会如何设计这个系统?我在这里寻找表规格,如果不是显而易见的话,可能还需要描述如何使用它们。对于那些可能相关的答案,我将使用ASP.NET和Linq-to-SQL(我熟悉LTS中的多对多)或Entity Framework。
编辑:澄清一下,我了解基本的DB设计、标准化、多对多映射表等。我正在寻找这种具体情况的简洁解决方案。
编辑2:我正在寻找通用解决方案,因为系统中可能会有比书籍更多的子对象。作者可能与其他作者、杂志、事件等相关联,我感觉如果我为每个人单独实现历史记录,我就要重复很多工作。