2008-12-04 33 views

回答

4

我確定它是密鑰的一部分,但會補充說你還應該有一個自動遞增序列號作爲PK的一部分,並強制任何日期以UTC寫入數據庫,下游系統比轉換到當地時間。

我工作的一個系統決定,每當觸摸另一個表時,讓Oracle觸發器寫入數據庫是一個好主意,並且使sysdate成爲沒有序列號的主鍵的一部分。唯一的問題是,如果您運行每秒超過一次命中行的更新查詢,它會中斷正在記錄更改的表上的主鍵。

+1

UTC事物上的+1。我們的數據庫不使用UTC,它會導致我們一個痛苦的世界。 – 2008-12-04 20:55:23

2

輕微CON將是它不是優雅的手柄一些其它標識符

(例如說一個同事請你可以看看記錄475663是不是說請你可以看看2008-更容易一點12-04 19時34分02秒)

也有在不同的日期格式混亂的在不同的語言環境風險

(如2008年3月4日 - 2008年4月3日在歐洲,2008年3月4日在美國)

(我的首選總是使用單獨的鍵列)

+1

ISO日期格式YYYY-MM-DD岩石! :)作爲一名在美國工作的英國人,我一直把它作爲妥協位置,因爲即使在10年之後,MM/DD/YYYY在我的神經上像指甲一樣在黑板上閃閃發光。 – 2008-12-04 19:21:33

+1

是的,我試圖讓每個人都使用ISO。說起來容易做起來難.... – cagcowboy 2008-12-04 19:25:12

3

有一些問題我會問有關使用日期作爲主鍵的一部分。

日期是否包含時間部分?這使得事情變得棘手,因爲時間包括時區和夏令時。這不會更改日期/時間值,但可能會在根據查詢對數據進行排序或檢索方面產生意想不到的結果。

我非常相信使用代理鍵(即使用序列列作爲主鍵)而不是自然鍵(如使用日期)。

7

考慮部件庫存表 - 如果要在每天結束時存儲庫存水平,那麼part_id和date_of_day上的複合主鍵就可以。您可以選擇創建一個唯一鍵並添加一個合成主鍵,特別是如果您有一個或多個表使用外鍵約束引用它時,但這一點沒有問題。

所以沒有什麼必然的錯誤,但像其他任何方法一樣,它可以像帕特里克的例子那樣被錯誤地使用。

編輯:這是另一個要添加的評論。

我想起了一些我之前寫過的關於數據庫中的日期值是真的還是合成的主題。日期爲「YYYY-MM-DD」的可讀表示形式當然很自然,但在Oracle內部,這是作爲一個數字來存儲的,它只是表示Oracle的特定日期/時間。我們可以隨時選擇並更改該內部值的表示(以不同的可讀格式或完全不同的日曆系統),而內部值不會丟失其具體日期和時間的含義。我認爲在此基礎上,DATE數據類型介於自然和合成之間。

0

日期作爲主鍵的唯一或第一個組件導致高插入表上的性能問題。 (表格需要經常重新平衡)。

如果每個日期插入多於一個,通常會導致問題。

在大多數情況下,我認爲這是一種難聞的氣味,並會提出反對意見。

2

一如既往..這取決於。

你在PK中包含日期/時間列的目標是什麼?是否提供關於記錄的附加信息而不必實際選擇行?

我在這裏可以預見的主要問題是顯而易見的問題,即是否使用UTC日期或本地日期?日期是否會被誤解(有人認爲這意味着當地時間,意味着UTC)?正如其他一些人所說,這可能會更好地用於替代/複合鍵嗎?您的性能可能會更好地用於除主鍵以外的密鑰或索引。這個想法讓我想起(1) COMB(組合的GUID)背後的理論,儘管這裏的想法是爲PK創建一個唯一的ID,這個ID更好地索引/索引較少索引重建,而不是將任何有意義的日期/時間值添加到行中。

(1)http://www.informit.com/articles/article.aspx?p=25862&seqNum=7]

4

,如果你已經決定使用「自然」主鍵,那麼問題是:是日期的主鍵,或者不是一個必要組成部分 - 優點/缺點是不相關的!

+0

沒錯。任何其他的考慮都是關鍵的。要麼區分唯一性在邏輯上是正確的,要麼不是。如果是這樣,無論是在自然PK中,還是應該在另一種唯一性約束中。 在FK中它幾乎不會有用。 – dkretz 2008-12-04 18:48:45

+0

MMM ...永遠不會在FK中有用嗎?如果你PK包含它,它是IMPERATIVE它是在FK。沒有選擇的有用或不是,它是什麼。隨身攜帶複合鍵肯定更難,但它可能性更大,效果更好。 – 2008-12-04 18:59:57

0

沒有什麼特別的錯誤,但其他海報已經注意到你可能會遇到時區和當地人的問題。此外,您最終可能會有大量DATE()函數模糊您的SQL。

如前所述,如果它是一天結束時的庫存,您可以考慮使用八字符文本字段,如「20081202」作爲主鍵的第二部分。這樣可以避免時區語言環境問題,並且如果需要的話,很容易轉換爲真實日期。

記住主鍵有兩個功能來唯一標識記錄並強制唯一性。代理主鍵不會。

2

日期製作完美的主鍵,只要它們作爲自然鍵的一部分是有意義的。我會像表使用日期:

  • holiday_dates(hol_date日期)
  • employee_salary(EMPLOYEE_ID整數,sal_start_date日期)

(什麼是添加上述替代employee_salary_id點? )

對於一些表,日期可以使用,但其他東西更有意義的主鍵,例如:

  • hotel_room_booking(booking_reference)

我們可以用(room_no,booking_from_date)或(room_no,booking_to_date),但一提的是與客戶端等我們不妨讓這些成爲唯一約束通信更有用,但實際上我們需要更復雜的「不重疊」檢查。

-2

將日期用作主鍵的一部分可能會使表上的連接速度明顯變慢。如果需要的話,我寧願選擇一個代理鍵,然後選擇一個唯一的索引。

相關問題