Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 针对版本化数据库记录、多视图和少量更新的数据库设计_Sql_Sql Server - Fatal编程技术网

Sql 针对版本化数据库记录、多视图和少量更新的数据库设计

Sql 针对版本化数据库记录、多视图和少量更新的数据库设计,sql,sql-server,Sql,Sql Server,编辑以消除一些混淆:我主要是希望确保select查询速度快而不会陷入错误的做法,如果在可以从其他存储数据派生信息的情况下使用isLatest字段被认为是错误的做法 我遇到的情况是,管理员创建蓝图,用户使用该蓝图的实例,但不能修改管理员设置的任何数据。通常,对于蓝图,将有许多select查询,很少有create/update查询。以下是我目前的设计: Table BluePrintFromAdmin Long id //PK String someData String m

编辑以消除一些混淆:我主要是希望确保select查询速度快而不会陷入错误的做法,如果在可以从其他存储数据派生信息的情况下使用isLatest字段被认为是错误的做法

我遇到的情况是,管理员创建蓝图,用户使用该蓝图的实例,但不能修改管理员设置的任何数据。通常,对于蓝图,将有许多select查询,很少有create/update查询。以下是我目前的设计:

Table BluePrintFromAdmin
    Long id //PK
    String someData
    String moreData
    ...

Table InstanceForUser
    Long id //PK
    Long bluePrintFromAdmin //FK referencing BluePrintFromAdmin id.
    String userData
    ...
不过,我需要做的是让管理员能够更新蓝图,而不影响用户正在使用的当前实例。旧的实例必须继续按预期工作,因此为历史蓝图创建单独的表是没有意义的。我正在考虑以下几点:

Table BluePrintFromAdmin
    Long id //PK
    Date dateCreated //Datetime when this blueprint was created.
    Boolean isLatest //True if this is the most recent blueprint, false otherwise.
    String blueprintGuid //This value is the same for a blueprint and its modified blueprint, to track changed blueprints.

    String someData
    String moreData
    ...

Table InstanceForUser
    Long id //PK
    Long bluePrintFromAdmin //FK referencing BluePrintFromAdmin id.
    String userData
    ...
我经常需要以可分页的方式列出所有最新的蓝图和实例

我主要关心的是当最新记录可以从dateCreated和blueprint Guid派生时保存isLatest。有一个单独的isLatest将使select查询更快,因为否则数据库将需要为每个唯一的blueprintGuid指定一个最大值。我不确定是否索引将blueprintGuid和dateCreated将启用类似的速度,或者仍然比简单地使用额外的isLatest列慢得多

一个具体的用例示例是:一个允许管理员创建电子邮件模板和用户选择电子邮件模板的系统,其中添加的内容单独存储。我需要能够为管理员列出最新的电子邮件模板,我需要用户能够列出和更新他们的实例。管理员还可以更新电子邮件模板,旧版本和新版本都应按预期工作


我正在使用SQL Server。对于这个用例的数据库设计有什么建议吗?

如果我正确理解了您的问题,那么可以归结为我是否应该通过添加一列来反规范化

在这种情况下,一切都与背景和权衡有关。您担心包含MAX子句的性能;实际上,在现代硬件上,我怀疑你是否能够分辨出区别,除非你处理的是巨大的数据集——而数亿行并不是巨大的。总有一些奇怪的问题,但如果您关心性能,请构建一个测试平台,用您认为系统需要处理的数据量的3倍填充它,并优化模式,以便它处理您认为将得到的负载

如果你能证明你有性能问题,那就买更多/更好的硬件。这比调试由中断“不要重复”引入的问题所需的时间要便宜得多

只有当你有了一个测试平台,可以证明你有一个性能问题,并且在硬件上花了钱,我才会考虑去规范化


为什么??因为它会导致错误。在您的例子中,我怀疑布尔标志是否会对性能产生巨大影响,因为索引倾向于支持具有高基数的列。此外,一旦您找到与特定ID匹配的所有记录,版本的数量就不太可能很大

你期望得到什么样的答案?这是如此的模糊和开放。如果这不是一个好的设计,请更正数据库设计。特别是关于isLatest。如果我还创建了dateCreated并可以从中获取最新记录,那么跟踪更改似乎是一种奇怪的方式,但如果是选择重的记录,则速度可能会很慢。您的用例一点也不清楚。充其量,我们可以猜测你可能想做什么。但是,关于您的表或流程,几乎没有足够的细节。我们如何才能提供任何关于改进我们看不到的设计的建议?我将编辑此问题,以添加有关查询的更多详细信息。谢谢,这是我一直在寻找的。我想等待更多的答案,但除非如此,这将被接受。