2017-02-24 75 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等

在任何情況下,它是一個代碼嗅覺,這不是一個好主意,除非它是架構中的一個基本不變的枚舉。