2010-01-27 52 views
2

我想構建一個數據庫範圍的唯一標識。該唯一標識應該是該數據庫每個表中每行的一個字段。在多個表中維護唯一的標識

有我已經考慮了幾個方法:

  • 有自動遞增場,並在每其他表的觸發器創建一個主表,如:

    「插入這裏之前,插入主表 - >獲取自動增加值 - >並在這裏使用這個值作爲主鍵「

    我以前見過這個,但不是做一個INSERT,它做了2個INSERT,期望不會是高性能的。

  • 爲每個表添加一個字段uniqueId,並使用PHP生成的整數填充此字段...類似unix-timestamp加上一個隨機數。我不得不使用BIGINT作爲數據類型,這意味着大index_length和大data_length

  • 與「uniqueId」的想法類似,但BIGINT的實例我使用VARCHAR並使用uniqid()來填充此值。

+3

數據庫範圍唯一標識符的用途是什麼?如果每個表都有主鍵,則每行都有一個由tablename.pkey組成的唯一ID。 – dnagirl

+0

這是一個可怕的,可怕的想法,只會導致痛苦和痛苦。 –

+0

我曾多次考慮過這樣的事情,比如製作(幾乎)網頁上的每個元素都可評論,或者甚至針對每個元素的評分。我一直認爲這會讓事情變得簡單。 @Ignacio:即時通訊並不是在談論如何使用這個主鍵,如果你這麼認爲。爲什麼你認爲通過多個表的唯一標識符是不好的? –

回答

2

既然你正在尋找的意見...你給了uniqid()解決方案,我會「投票」三大理念。在執行方面它似乎相當低的成本(但可能不是執行)。

一個簡單的解決方案(我認爲)將只是添加一個字段到每個表來存儲一個GUID和設置字段的默認值爲MySQL的函數,生成一個GUID(我認爲它是UUID)。這可以讓數據庫爲您完成工作。

本着提出隨機想法的精神......可能會有某種離線流程異步填充ID。確保每個表都有適當的字段,並使默認值爲0 /空。然後脫機進程可以簡單地在每個表上運行一個查詢來查找那些還沒有唯一標識的行,並且可以填充它們。這可以讓您控制標識,甚至可以使用某種遞增的整數。這當然要求每次插入記錄時都不需要唯一的ID。

+0

謝謝你的想法,馬克。我個人最喜歡的解決方案,直到現在,是BIGINT解決方案,導致我有點害怕uniqid()隨時產生一個不唯一的id。我也喜歡你的想法的MySQL的UUID()...但這將是一個非常長的字符串。最多9個數字的unix_timestamp +隨機數將會減小將近50%,並且實際上不可能生成一個不唯一的ID ... –