根據我的經驗,現實生活中的大多數生產DBA可能會按照您的建議進行操作,並將鍵列聲明爲NUMBER而不是NUMBER(n)。
向教授詢問是什麼讓這種方法在他或她看來不切實際是值得的。有幾種可能性,我可以想到
假設您正在使用數據建模工具來設計您的模式,一個合理的工具將確保一個密鑰的數據類型將在它所在的表中是相同的定義爲主鍵和子表中的外鍵。如果爲主鍵指定長度,則強制鍵生成沒有長度限制的外鍵將是不切實際的。當然,與此相反的是,您可以將主鍵和外鍵列都聲明爲NUMBER。
DBA往往是非常挑剔的(我的意思是這是一種恭維)。他們喜歡看到所有組織都「如此」。將長度限定符添加到字段,無論它是NUMBER還是VARCHAR2都充當隱式約束,以確保不正確的數據不會被存儲。理想情況下,當你設計一個表時,你會知道你在表的生命週期中插入的行數的合理上限(例如,如果你的PERSON
表結束了超過100億行,那麼可能會出現嚴重錯誤) 。將長度約束應用於數字列向DBA表明您已經完成了這種分析。
但是,現在至少在數字列方面實際上不太可能發生,因爲它更符合瀑布規劃方法,這些方法通常涉及這種詳細的設計討論,並且因爲人們更少關注傳統上同時進行的增長分析。如果您在20年或30年前設計數據庫架構,向DBA提供每張表在上線和接下來幾年投影大小的逐個表格細分並不罕見。今天,在磁盤上花費更多,而不是花時間做前期分析的成本效益更高。
此外,代理鍵通常會在鍵值中出現空洞,因此最大的代理鍵將大於表中保存的行數。對於指定序列中較大的緩存值以在RAC上獲得良好性能,情況尤其如此。因此,您不希望NUMBER(10)僅僅因爲您不希望處理超過(10e10)-1條記錄而需要。 –
@Shannon - 確實。但是,如果你有更多的漏洞比中等活躍的桌面上的數據漏洞更不可能,那麼即使我們每個人都註冊了4個人,你仍然可以安全地說世界上有60億人。還有數十億人還沒有出生,我們在行之間的平均差距爲5,但NUMBER(11)仍然足夠。 –
如果在輸出中使用代理鍵(例如作爲對應的參考號),我仍然會將最大尺寸放在上面,這樣您就可以明確地知道信件(或屏幕)中需要的空間)顯示該值。 –