我有一個TCG卡的數據庫,我試圖決定一個主鍵。最初,我用代理鍵解決了這個問題,但是我意識到,有時候,有些卡片是我忘記添加的,例如促銷卡片。這是代理鍵問題,因爲它們以最新的自動增量添加到數據庫中,並且我不希望它們的ID依賴於它們插入的順序。我在想也許我可以對一些卡的功能進行散列,並將其用作主鍵而不是?crc32作爲主鍵的自然鍵
就拿下面的僞代碼:
// set code, date released, collector number, name
$crc = crc32(implode(',', ['A', '1993-08-03', '232a', 'black lotus']));
echo $crc; // 4199975187
的卡的數量可能只徘徊25K左右,現在和成長每6個月左右100-300。
- 以這樣的速度,不會有碰撞的權利?
- 這是一個很好的做法嗎?我有其他好的選擇嗎?
我知道我可以做的哈希通過將其轉換爲base 62
短,但我將加入到這些用戶的庫存表所以我想保持這些在int
將是最好的選擇。
一般來說,「智能鑰匙」(例如從連接列產生的鑰匙)是一個_bad_想法。你能解釋一下爲什麼'代理鑰匙'不能解決你的問題嗎?密鑰只是一個唯一的數字,如果密鑰的值也恰好對應於插入的順序,它又有什麼關係? – hashbrown 2015-03-25 04:06:40
查看應用程序的用戶將看到「ID」。最有可能在$ _GET參數中。我不希望他們根據他們的ID猜測卡片插入數據庫的順序。 – voldomazta 2015-03-25 04:11:53
爲什麼插入順序對最終用戶有影響?這不像你揭露表名或實際祕密。大多數Web應用程序都使用密鑰的身份。很大比例在某處公開這些密鑰。沒什麼大不了的。 – Tim 2015-03-25 04:32:18