0

我继承了一个要迁移到 SQL Server 的 Access 数据库。在数据库中有很多标签或分类列。例如,订单表可能具有状态属性,供应商可能具有评级属性。大多数对它们没有真正的业务逻辑,它们本身不是实体,它们都只是允许用户标记和搜索的描述符。

一方面,我认为这些描述符应该放在他们自己的表中,并使用外键引用。然后在我的应用程序代码中,我可以使用与代理 id 匹配的枚举。为什么?因为我可以轻松添加它们,轻松更改值,也许可以节省一些空间。

Order { OrderId int, CustomerId int, StatusId int}
Status { StatusId int, Name varchar(50)} 

另一方面,因为许多这些属性永远不会改变,永远不会被添加,而且我还有很多其他的事情要做,我想我应该离开它。

Order{OrderId int, CustomerId int, Status varchar(50)}

第一个选项是否高于它应该始终完成的方式?第二个选项可以接受吗?我认为保留它的唯一缺点是表会更大一些,并且字符串比较可能不如 int 比较快。

4

1 回答 1

0

如果您需要对在该“状态”列中找到的值进行更多控制,您还可以将 Order.Status 中的不同值插入到另一个表中,并为其设置外键引用。按照您描述表格的方式。. .

Order{OrderId int, CustomerId int, Status varchar(50)}
Status {Name varchar(50)} 

不过,我会为该列选择比“名称”更具描述性的内容。级联更新还是删除取决于应用程序。当您在 SQL Server 上时,您可以控制允许谁使用 SQL GRANT 和 REVOKE 语句更新“状态”表。(您也可以使用 Access 做到这一点,但您似乎正在远离它。)

要从此表中获取有意义的数据,需要两个连接而不是三个。考虑一下您是否需要在该列中包含 50 个字符。(访问默认为 50。大多数人从不更改它。)

现在,要回答您的问题,上面的第一个选项并不是应该始终采用的方式。ID 号总是会增加所需的连接数,并且您仍然需要对自然键进行 UNIQUE 约束。将 ID 号码用于美国州代码、邮政编码等是没有任何意义的。第二个选项对我来说通常是不可接受的。我通常会像在这个答案的顶部那样使用外键引用另一个表。

于 2013-03-20T00:31:18.680 回答