一家大型國際公司部署了一個新的網絡和MOTO(郵購和電話訂單)處理系統。除其他事項外,您還負責設計訂單和客戶識別號碼的格式。客戶號碼,訂單號碼的最佳格式是什麼?
你認爲最好的格式是什麼?請列出任何假設和考慮事項。
接受的答案
邁克爾·哈倫的答案選擇,由於大多數選票,但請務必閱讀其他的答案和評論,因爲他們使邁克爾的回答更加完整。
一家大型國際公司部署了一個新的網絡和MOTO(郵購和電話訂單)處理系統。除其他事項外,您還負責設計訂單和客戶識別號碼的格式。客戶號碼,訂單號碼的最佳格式是什麼?
你認爲最好的格式是什麼?請列出任何假設和考慮事項。
接受的答案
邁克爾·哈倫的答案選擇,由於大多數選票,但請務必閱讀其他的答案和評論,因爲他們使邁克爾的回答更加完整。
請使用全部數字或全部字母。如果你必須把它混合起來,那麼確保沒有不明確的字符(Il1m,O0等)。
顯示/打印時,請在每3-4個字符中放入空格,但要確保您的系統可以處理沒有空格的輸入。
編輯: 需要考慮的另一件事是建立一種內置的方式來區分訂單,客戶等。客戶始終以10開頭,訂單始終以20開頭,供應商始終以30開頭等。
我只會使用數字,因爲它是國際公司。我會用空格或破折號每4-6個數字來分隔它。我也想保持獨立的格式,以便快速識別
例子:
000-00000-00000 - 可能是一個客戶號
00000-00000-00000-00000 - 可能是一個訂單號
建立在丹尼爾和邁克爾的問題上:如果分開的數字意味着其他的東西更好。例如,我在一家公司裏賬號是這樣的:
XXXXXXXX-XXXXXXXX
的第一組數字表示的區域和第二組代表該地區內的市場。一旦你習慣瞭解什麼是數字,它就可以很容易地告訴一個賬戶在哪個區域,而無需查看客戶的賬戶。
假設訂單/客戶的創建不集中,或不會總是集中,使用GUID
如果訂單/客戶的創建將始終集中,無符號整數會被罰款
沒有令人信服的理由讓客戶號碼的訂單號碼「意味」任何東西,並且很可能任何發明的分段號碼方案都必須在路上進行徹底檢修。堅持一些獨特而無意義的東西。
編輯:對於MOTO,任何多字母字母標識符都會在手機上引起問題,所以GUID是正確的。假定多個分散的MOTO位置,爲每個MOTO位置分配一個前綴(A,B,C等,或01,02,...),併爲客戶和訂單ID使用整數或大整數,例如01-1是MOTO位置#1的第一個訂單。請注意,零填充是不必要的,對數字施加了隱式數字限制,並且要求客戶在說出數字時區分六個零和七個零。如果您必須使用填充的固定長度格式,請將數字分成不超過4或5位數的組。
附錄:訂單號和客戶編號不一定是各自表的主鍵,只是用於查找的唯一索引列。您可能想要爲數據庫中的主鍵使用更簡單/更高效的操作。
指導+1。它們很容易,你不需要同步或處理大量的ID。生成並忘記。 – 2009-03-17 22:22:10
我同意從數據庫的角度來看,Guid是主鍵的絕佳選擇,但如果客戶必須通過電話或書面形式提供Guid,我不確定這是否是此用例的一個好選擇,即郵件和電話訂單。 – 2009-03-18 02:54:41
@ [Timothy Lee Russell]:好的,GUID對MOTO來說並不好 - 但它也不是一個複雜的,固定長度的,「有意義」的編號方案。請參閱編輯部分的答案替代。 – 2009-03-18 04:44:42
我有我的訂單號格式如下:
ddmmyyyy-####-####
其中,#### - ####在每一天的開始重置爲零。這使得將訂單與放置日期關聯起來非常容易。
對於客戶ID,我會混合使用大寫字母和數字,但正如Michael所說,避免常見的錯誤字母(0,o,L,1,5,s)。這會給你30個角色來處理。如果您使用20個字符,那將會給您幾乎64位的客戶ID範圍 - 對於安全性來說非常有用。確保在生成ID時使用安全的隨機數生成器。至於如何顯示格式,它應該是以下幾點:
####-####-####-####-####
正如邁克爾說了一遍,確保您的系統可以處理破折號,空格,沒有空格,或沒有破折號。 (它應該在驗證前從輸入中去掉所有這些字符。)
我希望有幫助!
我認爲在國際公司id中使用這個日期可能會引起大量的混淆。 – 2009-03-17 22:18:13
yyyymmdd - #### - ####。在那裏,我爲你修好了:-) – stevenvh 2009-03-18 07:05:40
根據需要設定數字,但不能超過。每次我支付水費時,都必須輸入20位數的客戶編號和18位數的發票編號。謝天謝地,我的顧客號碼中有一個短劃線將其分成兩部分。
不要依賴前導零。必須弄清楚我的發票號碼中有多少個零是非常煩人的。以000000000051415432爲例。他們的系統不會僅僅識別51415432.
將數字組在一起。如果你絕對需要使用長號碼,那麼四位數的塊應該可以正常工作。
僅使用數字的主要優點是可以使用10鍵更高效地輸入它們。
該數字的長度應該儘可能短,同時仍然包含您期望編排並留出餘地的整個實體空間。這可能很棘手,應該給予一點思考。給定一組元素,有點set theory可以爲您提供您將有權訪問的唯一鍵的數量。
說話時,將數字分成兩到四位數是很自然的。通過以某種模式插入破折號,您可以「強制」客戶以更有效和毫不含糊的方式重複使用破折號。
例如,323-23-5344當然是社會安全號碼格式,它有助於通知說話者發聲號碼時要停下來的地方。它還提供了編寫該編號時的視覺描繪,並且可以在複製編號時輕鬆進行比較。
我建議訂貨系統正確屏蔽輸入,以免隨時輸入破折號。這應該通過印刷表格來提供應該輸入內容的明確期望。例如,用打印的破折號分隔每個數字的打印框。
我不同意應該在這個數字中嵌入太多的信息,特別是如果這些屬性可能會改變。例如,假設我們給「323」的意思是「很好的顧客」,但他們以一種態度打電話給他們四次。那麼我們是否會將他們的客戶密鑰更改爲「324」,「是一個混蛋」?如果他們在04區域並將他們的公司遷移到05區域,該怎麼辦?
如果發生這種情況,您的選擇將是更新整個數據庫中的主鍵,或生活在嵌入該鍵的信息不再可靠的含糊之處,從而呈現所有嵌入可疑實用程序鍵中的信息。
最好存儲可能在數據庫中作爲單獨字段更改的屬性,並讓客戶編號成爲該客戶唯一的,不變的密鑰。
您可以添加一個小校驗和(例如使用XOR)以確保(增強)給定ID的正確性。 如果是郵件,請考慮z-base-32編碼。但在這裏,通過電話訂購,您可能更喜歡小數標識。
棒數字(無字符或特殊的東西):
有Severa的l我在回答這個問題時所做的假設;有些是基於它是一個大型國際組織的事實,有些基於格式是針對兩種不同表格類型的事實。基於這樣的事實,它是一個國際組織
假設:
假設:
注意事項:
擬議形式: SSSS0RR0TTC
提出的格式是儘可能簡單,而不是簡單:
實例
假設:
優點:
輸入錯誤號碼的缺點
對代碼格式問題的額外考慮 - 爲OrderId和CustomerId創建一個單獨的類。這些類是不可變的,並驗證它們的輸入以確保它們是可接受的ID。此外,沒有價值可能和訂單ID和客戶ID。
最簡單的方法就是讓OrderId的後備值是以1開頭的整數,CustomerIds是以2開頭的整數或類似的東西。
我會爲訂單號碼和客戶號碼使用完全數字系統,這將允許您避免與其他語言的問題。
避免前導零,因爲這會導致數據輸入和驗證問題。
每個數字的位數取決於您的預期音量。您將始終擁有比客戶編號更多的訂單編號。一個六位數的客戶號碼從100000開始仍然會給你899,999個客戶。爲訂單號添加額外的3-4位數字,將爲您提供每個客戶999到9,999個訂單(如果您考慮關閉客戶,則會獲得更多訂單)。
沒有必要在您的編號順序中建立任何類型的標識。您還有其他數據庫字段來識別客戶來自哪裏,等等。不要使系統過於複雜。
KISS(保持簡單計算器)
哇 - 多麼簡單而又發人深省的問題!什麼是很多矛盾的答案。我認爲這裏有3個明顯的候選答案:
1)使用自動增長長整數。 2)使用GUID 3)使用包含ID中其他信息的複合類型。 (1)對於更簡單的系統,尤其是基於網絡的系統(其中所有用戶正在擊中中央數據庫),(1)效果良好。它的優點是數字儘可能短而簡單,但不能更短,避免使用字母字符(你會驚訝地發現同一個字母在不同國家的名稱是不同的 - 一個國家E是另一個國家I)。它本質上不會將訂單ID與客戶ID區分開來,但是您總是可以預先添加或附加「C」或「O」,並在輸入時默默放置它們? 它也沒有校驗和或錯誤檢查。
對於許多軟件組件需要動態創建數字的分佈式系統,無需參考master數據庫(2)是唯一的方法。由於地址空間非常大,但是出於同樣的原因,它們的優點是很大程度上檢查錯誤,因爲它們太長且字母數字以便在電話上舒適地讀取。 (3) - 將區域信息或今天的日期嵌入數字 - 這些都是經驗豐富的開發人員培訓出來的各種想法。起初看起來是個好主意,但總是會困擾你。考慮客戶移動到新狀態的情況,還是在最初發布後的一週內手動重新生成訂單?這些信息項屬於相關的表格,在這些表格中,它們可以獨立編輯,而ID應該僅代表實體標識。 重複:不要在ID或主鍵中對業務數據進行編碼 - 每當你這樣做時,你都會留下定時炸彈給其他人清理一天。
鑑於這是一個集中的(基於電話)系統,我會選擇(1),直到明確的需求發生變化。簡單通常更好。按其他人的建議插入連字符,並根據需要預先安排或附加校驗和和/或標識字母。
第一步:如果組織規模足夠大以至於需要這樣的系統,那麼您現有的系統已經替換。如果可能的話,繼續以前的系統方案。如果您可以訪問舊系統的數據(即使在基本級別),它也可以使許多事情變得更加簡單。
也就是說,改變方案通常有很好的理由,特別是當它來自遺留系統時。不過,我發現,在繼續之前正式排除舊計劃通常是有幫助的。
第二步:這樣的系統從來不存在於真空中。用戶和/或訂單ID是否已有組織範圍的計劃,例如會計,庫存管理或CRM系統?如果是這樣,考慮採用現有的方案使互操作性更容易。許多大型組織可以通過多種方式指定單個客戶或訂單,這使得從數據中獲得有用的智能變得更加困難。
第三步:如果舊系統的方案太糟糕了,沒有其他方案可以繼續採用,請自行推出。在這種情況下,看看最初的方案的缺點,無論它們是什麼,並糾正它們。正確的答案將取決於應用程序的具體要求。您給我們的問題陳述太模糊,無法有效推測最終形式的外觀。
我會從不在ID中使用用戶信息。假設您使用客戶姓氏的第一個字母后跟一些數字:例如Thomsom可能是客戶THOM-0001。 只是,看起來你犯了一個錯誤,而這個人的名字是湯姆遜而不是湯姆森。用戶數據可以更正,ID永遠不可修改。所以下次你在TOMS -...下查找湯姆森時,你找不到他。與其他數據一樣,例如客戶類型。它可以隨時更改,ID不能。
這是RDBMS的基礎。
只需使用計數數字。爲了便於閱讀,插入分隔符是一個不錯的主意,因此您永遠不會有超過4個連續的數字:9999-9999比999-99999好。並且不要讓數字超過必要的時間;人們被減少到20位數而不是減少到一個數字更爲惱人。
雖然有一個問題。特別是如果你有一個小企業,簡單的櫃檯可以給你更多的東西,比你想象的更多。說我點了你的東西,訂單號是090145.下個月我再次訂購,訂單號是090171.呃..一個月內有26個訂單?同樣,在一個已經活躍了10年的企業中,我不願意成爲客戶0006。
解決方案很簡單:跳過數字。不要使用隨機數字,因爲您仍然希望它們按順序排列。
請勿編碼任何可變的客戶/訂單信息到數字!你必須假設一切都是可變的!
以上建議中的一部分包含地區代碼。公司可以移動。你自己的公司可能會重新組織和改變自己對地區的定義。客戶/公司名稱也可以更改。
客戶/訂單信息屬於客戶/訂單記錄。不在ID中。您可以稍後修改客戶/訂單記錄。 ID一般都是用石頭書寫的。
即使只是將生成數字的日期編碼到ID中似乎也是安全的,但是假定生成數字的系統上的日期永遠不會錯誤。同樣,這屬於記錄。否則它永遠不會被糾正。
多個系統是否會產生這些數字?如果是這樣,如果僅使用基於日期的和/或連續的數字,則有可能發生重複。
不知道有關該公司的多了,我開始沿着這條道路:
將其分解爲多個片段使其更容易被人看懂,正如其他人指出的那樣。
CX5-0000758-82314-12是由該方法產生的可能數字 。這包括:
我總是堅持使用自動遞增數字,並且我總是將序列排序得足夠高,以便它們都具有一致的數字位數 - 似乎不那麼令人困惑。
我有時也會開始一個訂單號碼,比如6位數字,從200,000開始,客戶號碼爲5位數字,從10,000開始,例如可以給我90,000個唯一客戶號碼和800,000個唯一訂單號碼,只要看看它是客戶號碼還是訂單號碼就可以了。 (也就是說,如果客戶代表通過電話詢問數字,它將立即明顯是哪一個)
但是,我不會在應用程序中建立依賴於該應用程序的邏輯,所以即使它確實翻身,系統不會在意。
我建議使用16位數字標識符,當打印或顯示給客戶時,格式爲xxxx-xxxx-xxxx-xxxx,但在系統中沒有破折號存儲。
使用這種格式的原因是它可以讓人們更容易地讀出電話號碼來讀取電話號碼,因爲他們可以以4批次的方式進行讀取,而不是試圖記住他們已經說了多少。
如果您希望前4位可用於識別號碼類型,客戶1000,供應商2000,訂單3000,發票4000等。
如果您希望保留使用yymm格式編碼在數字本身中的那種信息,那麼第二組可以是年/月標識符,因此1000-0903-xxxx-xxxx將是3月進入的客戶2009.
然後,這會爲您留下8位數字作爲實際數據本身。
我會考慮在識別符中使用字母對於處理電話的任何系統來說都是一個非常糟糕的主意,因爲口音和理解的差異如此多樣以至於人們在試圖獲得他們的標識符時會感到不安被無法正確理解其口音的人識別。
我們使用前導零對於一些我們的參考「數字」,我的工作的,我不能告訴你有多少浪費時間我已經在過去的七年裏迫使Excel來對待他們爲文本。不要這樣做。
自動遞增整數對計算機來說都很好,但它們大大減少了人類發現錯誤的能力。這將取決於您的業務的重要性。我與財產(住房)相關的數據一起工作,我們的主要參考資料中嵌入了前門。這並不優雅,但這意味着有經驗的管理人員在他們靠近數據庫之前可以發現90%的小錯誤(當我們收到發票等時)。但是在一個不依賴於這種過程的環境中,這種說法不那麼引人注目。
(現在,有些人強烈警告說,在參考使用有意義的數據,因爲它可以改變,而且有一定的道理在,但你可以很聰明。你不必撿東西明顯善變比如這個人是否已婚 - 你可以將自己固定在過去的事件上,比如他們首先開設一個特定賬戶的地區的角色,即使你沒有這樣做,也會有一些模式來幫助與客戶溝通。在一些呼叫中心工作,有時候人們會用出生證明文件中的每一條文件打電話,因爲他們拼命地試圖找到他們的賬戶/訂單/客戶號碼。我不認爲「這將是一個數字1和100兆「將非常方便)
有人說過,但不要創造很長的參考。我們很忙,我們沒有時間在電話系統上鍵入這個垃圾,並且只在數字17上犯了一個錯誤才重啓(再次)。您的某些客戶可能有殘疾,而且越來越多的客戶可能會超過55歲以上。再次注意零點。您可以看到具有十四位數字的採購訂單號碼等。他們認爲他們將放置多少訂單?
如果你的網絡之外會有任何數據聚合(因此沒有連接到你的數據庫) - 你的合作伙伴/供應商可以驗證他們沒有犯錯的某種形式的校驗位/正則表達式模式。其中一個例子就是英國的電力供應編號系統(MPAN)就是一個很好的例子 - 專爲人們維護他們自己的記錄而設計,無需下載宇宙中每個電錶的大名單以檢查他們沒有做出的一個錯字。
這裏最大的問題就是儘量不要過問這個問題。
雖然我在電子商務系統方面比較有經驗,但我認爲這篇文章中的一些觀點可以應用於郵購和電話訂購系統。
對於訂單,自動遞增整數可以完美地作爲數據庫中的主鍵以及客戶在他/她的發票上看到的數字。絕對沒有理由爲您的數字創建一些過於複雜的算法。如果你想知道他們來自哪個國家/地區,請在數據庫中使用單獨的字段。同樣,如果你擔心你的競爭對手在監視你;讓他們!如果您的業務圍繞您的競爭對手進行,因爲您沒有獲得足夠的收入,那麼最有可能您的業務部門首先並不擅長。此外,如果你想欺騙你的競爭對手,你可以創建自己的腳本,自動創建假訂單。如果您的電子商務系統設計得很好,那麼這不會成爲問題。
使用自動遞增整數關鍵的東西:
每當或任何你正在設計應始終什麼是最好的客戶開始。在一天結束時,他們是把食物放在你的桌子上。快樂的顧客是回頭客。
對我來說,我的首選是獲得日期+今日交易的櫃檯組合。我遇到了只有5位數的訂單號碼的挑戰。因此,與這一點,我想出了下面的以下內容:
我決定用一個大於十進制的計數(10),所以我用16進制計數。因此,如果我將從十六進制(FFFFF)中獲得5位數的最大值,這將是1,048,575計數。通過涉及日期,我可以說我每天可以獲得1,048,575個計數。因此,爲了使每一天算獨特,我通過獲取以下的總和混合日期:
因此,與這一點,我將有最多3個字符開始爲我的計數。所以這將是XXX +今天的當前交易。例如:
當前日期:2014-12-31 下午1點22分 實施日期:當今交易2010 運行總計:100
計數:(5 + 13 + 365)+ 101 = 383101 訂單號:AD-5D87D
AD只有一個自定義訂單號碼前綴。所以到時候,我將會在我執行日期之後的1000000年內失序。
無論如何,如果您認爲每天的交易量可能高達1000000計數,這不是一個好的解決方案。
是的,我想說最重要的部分是消除歧義。我確信,過去曾經打過電話的一些公司如果不再問我'你確定這是我而不是1?',那麼他們可以節省大量的客戶服務預算。 – Carl 2008-10-07 14:19:32
我會用所有字母的所有數字。您需要使用更長的標識符,但是您可以避免(至少在美國英語中)這麼多字母在電話中聽起來幾乎相同。只有十個數字可以區分26個(+/-,取決於語言)字母。 – 2009-03-20 19:01:27
@Kyralessa:好點。 – 2009-03-21 01:27:53