2011-09-06 65 views
0

我有一個使用標準ID整數自動增量值的應用程序。我還有另一個管理當前設置爲整數的global_id的表。我認爲最好對這個全局值使用一個非整數,這樣可以根據是否存在非整數來清楚地使用項目ID還是全局ID: 例如:處理個人ID和全局ID

site.com/item/id/123 - item id 
site.com/item/id/12j45 - global id 

在內部,全局標識表仍然保留它的id值(對此不確定)。但我想有一個非整數global_identifier_id。有沒有可以處理這個問題的MySQL數據類型?就像獲取id值並添加一個(可能)隨機字符(1到1b,2到2d)。

有沒有更好的方案來處理這個問題?例如,也在考慮使用註冊到短語的對象的id對象 - 因此位置是id 123,但是成爲123loc作爲全局值。也許,有一個軌道組件已經這樣做了?

THX

@Doug
關於跨表唯一肯定的;基本上是對象關係阻礙不匹配問題的一個版本(對象列表)。目前有兩組ID,我手動管理它與您建議的兩個名稱空間類似。

命名空間並不是必需的,但是因爲如果一個設置爲int而另一個設置爲其他任何設置,則您知道您正在查看global_id。

回答

0

這將是優選的是具有兩個命名空間,如:

site.com/item/id/123 
site.com/item/gid/12j45 

否則,將要求global_id有一個字符時,從整數字段區分它和產生不必要的週期,以確定如何根據數據的內容查詢數據。

你想通過擁有global_id來完成什麼?這是多個表中的唯一性水平嗎?如果是這樣,只需在id字段附加一個字母就不夠了。大概設置一些觸發器可以做到這一點,但我會首先考慮整個過程。

更新:對於跨多個表的獨特性,有一堆答案,但一個簡單的一種是:

CREATE TABLE global_references (
    id int NOT NULL auto_increment PRIMARY KEY, 
    reference_type varchar(50) NOT NULL, 
    reference_id int NOT NULL, 
    UNIQUE KEY akGlobalReferences (reference_type, reference_id); 

當您添加一個新的記錄,插入相應的行此表與表名和新ID,並使用生成的ID作爲您的全球唯一ID。

你可能已經有了這個地方,正在尋找一種替代的存儲方法來添加一個字符。如果你真的想要這兩種類型的ID都使用相同的URL,我建議只需在ID字段中添加一個「推斷」前綴。舉例來說,如果兩個URL:

sites.com/item/id/123 
sites.com/item/id/g123 

您將檢查的第一個字符。如果是g,請將其剝離並檢查全局表格。否則,請檢查相關表格。不過,我仍然爲此推薦單獨的網址。

+0

跨多個表的唯一性 - 是 – timpone

+0

您的更新是我目前擁有的 - 想到一種重構方式,以便在UI方面,我們不必知道我們是處理object_id還是全局引用ID。 thx – timpone

0

我只是用這個字段的varchar。這樣,你可以追加任何你想要的原始物品ID。也許可以在原始ID(下劃線加上4個隨機字符)中添加_a27d之類的東西 - 這樣您就可以在下劃線之前查看並獲取原始ID。

+0

是的 - 這樣的事情 - 甚至可能有d指的是一個特定的對象,所以甚至不需要是一個查找步驟 – timpone

+0

或者你可以用一個「G」前綴的id - 表示它是全局ID –

0

您可以避免同時擁有本地ID和全局ID。

CREATE TABLE global_ids (
    id int NOT NULL auto_increment PRIMARY KEY); 

每個表都有自己的ID,它具有global_ids表的外鍵。

CREATE TABLE t1 (
    id int NOT NULL auto_increment PRIMARY KEY, 
    FOREIGN KEY (id) REFERENCES global_ids(id)); 

CREATE TABLE t2 (
    id int NOT NULL auto_increment PRIMARY KEY, 
    FOREIGN KEY (id) REFERENCES global_ids(id)); 

你還是最終會做兩個刀片(一個用於global_ids,那麼一個實際的表),但你不必處理兩種類型的ID。