因此,它就像我们的正常银行账户,我们有很多交易导致资金流入或流出.总是可以通过简单地总结交易价值来得出账户余额.在这种情况下,将更新的帐户余额存储在数据库中或在需要时重新计算时会更好?
每个帐户的预期交易量:每天<5
预期的帐户余额检索:每当交易发生时,平均每天一次.
您如何建议对此做出决定?非常感谢!
我有一个我正在使用的Web应用程序,它使用MySQL数据库作为后端,我需要知道在我继续进行之前,对我的情况有什么好处.
简单地说,在这个应用程序中,用户将能够使用任何数字字段(他们决定)构建自己的表单,现在我将它全部存储在由外键链接的几个表中.我的一位朋友建议,为了保持"简单/快速",我应该将每个用户的表单转换为平面表,以便查询来自它们的数据保持快速(如果增长很大).
我是否应该将数据库标准化为使用外键(索引等)汇集到关系表中的所有内容,还是应该为用户创建的每个新表单构建平面表?
显然,创建平面表的一些好处是数据分离(安全性),并且会降低查询速度.但是,我会从中获得多少收益呢?我真的不想要10000个表,并且要丢弃,改变和添加所有的时间,但如果它会比我更好...我只需要一些输入.
谢谢
这个问题与我在其他问题中可以找到的架构有关. 基本上在我的数据库中,我存储用户,位置,传感器等.所有这些都可以由用户在系统中编辑,并且可以删除.
但是 - 当编辑或删除项目时,我需要存储旧数据; 我需要能够在变更之前看到数据是什么.
数据库中还有不可编辑的项目,例如"读数".他们真的更像是一个日志.读数记录在传感器上,因为它是特定传感器的读数.
如果我生成一个读数报告,我需要能够看到读取时位置或传感器的属性.
基本上我应该能够重建任何时间点的数据.
现在,我之前已经完成了这项工作,并通过在每个可编辑表中添加以下列来使其运行良好:
valid_from
valid_to
edited_by
Run Code Online (Sandbox Code Playgroud)
如果valid_to = 9999-12-31 23:59:59则那是当前记录.如果valid_to等于valid_from,则删除记录.
但是,我对我需要用来强制执行外键一致性的触发器感到满意.
我可以通过使用"PostgreSQL"数据库的扩展来避免触发器.这提供了一个名为"period"的列类型,它允许您存储两个日期之间的一段时间,然后允许您执行CHECK约束以防止重叠周期.这可能是一个答案.
我想知道是否有另一种方式.
我见过人们提到使用特殊的历史表,但我真的不喜欢几乎每1个表维护2个表的想法(尽管它仍然可能).
也许我可以砍掉我的初步实施,以不打扰检查不属于"当前"记录的一致性 - 即只懒得去查制约记录中,其中的失效日期9999-12-31 23:59:59.毕竟,使用历史表的人似乎没有对这些表进行约束检查(出于同样的原因,你需要触发器).
有没有人对此有任何想法?
PS - 标题还提到了可审计的数据库.在我之前提到的系统中,总是有edited_by字段.这允许跟踪所有更改,以便我们始终可以看到谁更改了记录.不确定可能会有多大差异.
谢谢.
阅读CJDate数据库系统简介或类似水平书籍的人不应该对标准化和非规范化的定义有问题.
然而,记忆不像过去那样,我发现自己经常看一些设计并说它没有正常化,即使我找不到它正在破坏的正常形式.
说明它的实际例子是:
如果我们有关系
r1 (A, B, C) 和 r2 (A, D)
与FD:AB-> C和A-> D.
并且r1表示详细数据,同时r2是该数据的摘要(换言之,D的每个实例是r1中的值的函数.在该示例中,使其为根据来自r1的A的值C的小计).
示例实例
r1 =
A B C
1 1 10
1 2 20
2 1 10
2 2 25
r2 =
A D
1 30
2 35
Run Code Online (Sandbox Code Playgroud)
所以,即使我不能说它打破例如2NF或3NF,我似乎仍然坚持认为设计仍然在以下意义上非规范化(来自Codd,EF"数据库关系模型的进一步规范化") ,第34页,评论超过1NF的正常化原因):
- 从不受欢迎的插入,更新和删除依赖项中释放关系集合;
- 随着新型数据的引入,减少重建关系集合的需要,从而延长应用程序的使用寿命;
- 使关系模型对用户更具信息性;
- 使查询统计中的关系集合中立,这些统计信息随着时间的推移可能会发生变化.
我可以说,如果我们将D定义为来自r1的所有C的总和,其中来自r1的A等于来自r2的A,那么,如果我们在r1中更新C并且我们不在r2中更新D,我们可以最终由于不合适的更新依赖性并且数据最终处于不一致状态,我发现这个原因是将r1和r2称为非规范化并将它们视为非规范化.(事实上,整个r2是r1的函数,并将零个新事实带入模型; r2 = f(r1))
所以问题是
注意:
对于那些发现有趣的问题并给出答案的人,我请求提供可引用的内容或以特定的假设和结论形式(或者换句话说,如果你要去在你看来,请用一些推理跟着它).
编辑 我接受了dportas的回答.我将在这里尝试添加一点:CJDate可以做出明确而严格的区分:
许多设计理论都与减少冗余有关; 规范化减少了relvars中的冗余,正交性减少了relvars中的冗余.
并在下一页
正如未能一直正常化意味着冗余并且可能导致某些异常,因此也不能坚持正交性.
我的两个问题是:
详细说来,我有一个包含公司数据的几个非常大(在100-1000万行之间)的数据库.通常,在这样的表中存在大约20-40个公司的数据,每个公司都是由"CompanyIdentifier"(INT)标记的他们自己的"块".此外,每家公司都有大约20个部门,每个部门都有自己的"子块",标有"DepartmentIdentifier"(INT).
经常会发生从表中添加或删除整个"块"或"子块".我的第一个想法是在这些块上使用表分区,但由于我使用的是SQL Server 2008标准版,因此我无权使用它.尽管如此,我所拥有的大多数查询都是在"块"或"子块"上执行而不是在整个表格上执行.
我一直在努力为以下功能优化这些表:
对于1)和2)我没有遇到很多问题.我在关键字段上创建了几个索引(也包含有用的CompanyIdentifier和DepartmentIdentifier),查询运行正常.
但对于3)我一直在努力寻找一个好的解决方案.我的第一个策略是始终禁用索引,批量插入大块并重建索引.这在开始时非常快,但现在数据库中有很多公司,每次重建索引需要很长时间.
目前我的策略已经改为只是在插入时保持索引,因为现在这似乎更快.但我想进一步优化插入速度.
我似乎注意到通过添加在CompanyIdentifier + DepartmentIdentifier上定义的聚簇索引,将新的"块"加载到表中的速度更快.在我放弃这个策略以支持在IDENTITY列上添加聚簇索引之前,有几篇文章向我指出聚簇索引包含在所有其他索引中,因此聚簇索引应该尽可能小.但现在我正在考虑恢复这个旧策略来加速插入.我的问题,这是明智的,还是会在其他领域遇到性能打击?这真的会加速我的插入还是仅仅是我的想象力?
我也不确定在我的情况下是否确实需要IDENTITY列.我希望能够与其他表建立外键关系,但我是否也可以使用类似于CompanyIdentifier + DepartmentIdentifier + [uniquifier]方案的东西?或者它必须是一个表格,分散的IDENTITY数字?
非常感谢任何建议或解释.
database sql-server identity-column clustered-index sql-server-2008
我有一个通过ORM保存到数据库的对象.该对象有一个字符串数组,数组长度可以根据对象而变化.我想知道在数据库中存储String数组的标准做法(例如,我应该将所有字符串存储在一个字段中作为csv等.)?