2017-02-24 72 views
0

的PrimaryKey值,您好我来到这个情况在我的项目,那里的人硬编码在应用程序中的PrimaryKey列的值工作。这是一个很好的做法。在处理环境时,该记录的值可能会改变,但如何将身份插入到其他环境中。在硬编码的应用

+2

不,这不是一个好主意硬编码标识值。 – Siyual

+0

如果以这种方式构建应用程序,您是否建议继续这样做? –

+1

不可以。如果应用程序已经以这种方式构建,那么只要我能够做到这一点,我就会改变它。对身份值进行硬编码(*尤其是如果您有多个环境*)只是要求在环境之间的值不匹配时出现问题。更不用说,像'SELECT * FROM SomeTable T JOIN状态S ON T.StatusId = S.Id WHERE S.Name ='InProgress''这样的操作可以让你的意图100%清晰,而SELECT * FROM SomeTable WHERE StatusId = 3 “只会产生更多的问题,困惑,并最终找出其意图。 – Siyual

回答

2

虽然这显然是一个非常贫穷的做法,我毫不犹豫地拒绝这样的事不会对推理体面的信息。我通常会给我的同事带来怀疑的好处,并假设他们已经思考了这个问题并得出了一个合理的结论,我只需要学会理解他们的推理。

在某些非常罕见的情况下,硬编码标识可能是一个好的解决方案,例如,如果您的安装包也创建数据库和模式并为某些域查找值进行种子处理,以便它们在每个系统上都相同。在这些情况下,身份列的定义是种子比平常高一点(例如IDENTITY(100,1)),系统值总是低于种子(在本例中为100)。

例如,您可能有一个域表PhoneType,值1-3保留为“主要”,“帐单”和“联系人”。同时允许终端用户定义他们自己的电话类型为100和以上。

这绝对是一个贫穷的做法在运行时正确的,例如插入硬编码标识值以响应用户输入。在这种情况下,最好找到一个自然键,使用GUID或开发自己的身份跟踪系统。

+0

我实际上正在编写一个应用程序,它将有一个活动,我有一个活动列表的表格。我有一个控制台应用程序的活动,现在我有一个新的活动,有不同的执行。所以我想在同一个控制台应用程序中识别该活动,以便我可以为它创建不同的类和方法。你建议硬编码activityid(活动表中的主键)还是活动名称? –

+0

如果我使用GUID,是否在不同的环境中维护相同的GUID? –

0

通常我已经看到了这个地方有代码库(如枚举了某种这些对应用程序的基本系统基本类型),同时也是在数据库(如查找表)常数。有一些更好的方法来处理这个问题,但最终总是会在这些情况下得到硬编码,即使它不是主键。例如,主键可能是一个自然的关键。

通常你只会看到这是可以接受的非常基本的实体。程序中的某种类型的组织或实体可能是:TYPE_USER,TYPE_GROUP。你不会看到本作查找这是典型的用户可修改,或期待是可扩展的,或以某种方式不是重要的,像VEHICLE_TYPE_CAR,VEHICLE_TYPE_SUV,VEHICLE_TYPE_RV,VEHICLE_TYPE_MOTORCYCLE等

在任何情况下,它是一个代码嗅觉,这不是一个好主意,除非它是架构中的一个基本不变的枚举。