假设,我有两个SQL表:Table
和AuditTable
。InTable
是允许为空的float类型的列org_id
。而且,org_id
不是主键。具有相同名称的列位于AuditTable
中。我还有一个EditTable
类用于对Table
和AuditTable
进行更改。EditTable
的成员是通过用户界面设置的。EditTable
还包含一个组织id成员。
没有理由将Table.org_id
设为浮点值;它将始终包含整数值。但是,由于Table
已经存在,我不能改变Table.org_id
的类型。但是,由于我创建了AuditTable
和EditTable
我可以将AuditTable.org_id
和EditTable.org_id
设置为任何类型。
当Visual Studio将Table
转换为C#类时,Table.org_id将变为Nullable<double>
。我是否应该使AuditTable.org_id
浮点数允许为空,并使EditTable.org_id
为可为空的双精度数以匹配Table.org_id
?或者我应该同时做AuditTable.org_id
和EditTable.org_id
的ints然后做一些铸造?不过,我在想,为了安全起见,我不想选演员,只想让类型与最初的匹配。
谢谢你的建议。
最佳答案
哦,把连接键存储为浮点数是个坏主意。我希望SQL实际上禁止了这种做法。问题是,0.999999999看起来像1.00000000,但它们在连接时(或在where
子句中)不匹配。在这样的条件下,你所看到的就是你所得到的,这样会更好。
首先,去任何你能去的地方,乞求/贿赂/奉承/鼓励他们去做:
alter table `table` modify org_id int;
如果那不起作用,你就有一个难题。对于查询性能来说,将连接键设置为相同的类型(甚至是我不同意的类型)要好得多。而且,这对于数据库来说是一个非常重要的概念。所以,不能更改联接键。
相反,我认为应该在表中添加一个名为
org_id_int
的新键。这将有正确的类型,一个有用的索引——除了一个漂亮的名字之外的所有东西。用这个来连接。使用其他键连接到现有表,直到它得到修复为止。