在我们的库存数据库(SQL Server 2008标准版)中,我们有一个表(称为库存结果),它按库存期存储每个库存项目的结果,如下所示:
<< StockResults >>
PK StockPeriodID int
PK StockItemID int
OStockCost money
OStockQty real
DeliveriesQty real
CreditsQty real
TransfersInQty real
TransfersOutQty real
CStockQty real
OStockAmt money
DeliveriesAmt money
CreditsAmt money
TransfersInAmt money
TransfersOutAmt money
CStockAmt money
... except that it has about 40 columns
Run Code Online (Sandbox Code Playgroud)
我们正在考虑规范化该表,以便我们有一个用于字段的表和另一个用于数据的表.像这样:
create table StockResults_Fields
(FieldID int, FieldName varchar(20), FieldDataType varchar(10))
create table StockResults_Values
(StockPeriodID int, StockItemID int, FieldID int, FieldName varchar(20), FieldDataType varchar(10))
Run Code Online (Sandbox Code Playgroud)
我们考虑这样做的原因是为了提高表的性能并防止死锁(我们目前正在获得).关于规范化以减少死锁的建议来自本文:减少SQL Server死锁.
我担心的是结果表(已经很大)会变得更大.并且大多数报告在与当前结构类似的结构中显示数据 - 新方法将具有相当多的连接.
在我们开始涉及大量工作的事情之前,在我们开始之前,是否有人对结果的标准化结构和性能优势有任何建议?
编辑:谢谢你的建议.我有一种直觉,认为2桌的方法不是可行的方法,但我不确定为什么 - 直到现在.锁定错误已经解决:我们有一个没有聚簇索引的表,但快照隔离看起来像我们可能会考虑的.
听起来您在设计系统时知道所有需要的列.如果是这种情况,您绝对不应该继续进行您提出的设计.
这种设计的唯一可能原因是,如果您不了解设计时需要的所有字段,并且需要在生产后添加一些字段.
我预测你的双表方法会比你目前的方法表现得更差.
此外,这与规范化无关,至少根据我的定义.你要做的是从关系模型转向元数据模型.
(编辑:您还应发布有关死锁发生的时间/位置的更多信息,如果这是您要解决的问题的根源).
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |