在Int上进行SQL联接以获取小数值查找表

时间:2018-06-25 00:40:16

标签: asp.net sql-server entity-framework

我正在asp.net core 2.1(EF,MVC,SQL Server)中做一个项目,并且有一个名为Orders的表,最终该表将是交易的网格(即分类帐)这些数字的计算(无分页...因此可以运行数百或数千条记录)。

在该Orders表中,是一个名为Size的属性/列。 Size从0.01到10.0基本上是一个很大的值,以0.01 ..为增量。因此要开始使用1000个不同的值,我想95%的人会使用小于5.0的值。

因此,最初,我以为我会像在OrderSize上的Order表中使用FK约束那样使用Size (i.e. SizeId)连接表:

SizeId (Int)   Value (decimal(9,2))
1              0.01
2              0.02
...etc, etc, etc...
1000           10.0

OrderSize表很可能永远不会改变(即〜1000个十进制记录),并且Size表中的Orders值可能会非常重复,如果仅在其中转储小数,则连接表的原因。

但是,我对SQL的了解越多,我越意识到我不知道自己在做什么,而我节省的字节空间可能会导致其他性能下降的情况,或者谁知道。 / p>

我猜联接的SizeId Int使用4个字节?那么另外5个字节为实际的十进制值?我什至不确定要节省多少空间?

我意识到这两种方法都可能行得通,尤其是在较小的查询上?但是,技术上正确的方法是什么?在最终计算网格值时,是否还有其他陷阱或不应该考虑的地方,就像在帐户分类帐中一样(即假设join是可行的方式)?谢谢!

1 个答案:

答案 0 :(得分:0)

这实际上取决于您使用查找表的主要目的是什么。如果仅涉及存储空间问题,则可以使用其他方法设计数据库(使用分区并在价格便宜的存储上归档更大的表)。

那将比使用查找表方法更具扩展性(如果Orders表中有多个十进制字段,会发生什么-您是否为每个十进制字段创建一个查找表?)。

如果您决定通过该路由,那么在加入Orders表时还必须考虑OrderSize表上的索引。如果连接键不是Orders表上索引的一部分,则可能导致更频繁的索引扫描,从而导致查询性能降低。