我正在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
是可行的方式)?谢谢!
答案 0 :(得分:0)
这实际上取决于您使用查找表的主要目的是什么。如果仅涉及存储空间问题,则可以使用其他方法设计数据库(使用分区并在价格便宜的存储上归档更大的表)。
那将比使用查找表方法更具扩展性(如果Orders
表中有多个十进制字段,会发生什么-您是否为每个十进制字段创建一个查找表?)。
如果您决定通过该路由,那么在加入Orders
表时还必须考虑OrderSize
表上的索引。如果连接键不是Orders
表上索引的一部分,则可能导致更频繁的索引扫描,从而导致查询性能降低。