2012-05-12 24 views
0

我正在爲我的一個項目設計一個數據庫,並且在這個項目中我有許多不同種類的對象。每個對象可能都有它的評論 - 它從相同的評論表中抽取。在整個數據庫中擁有唯一行ID而不是僅在一個表中的最佳方法?

我注意到,當兩種不同類型的對象具有相同的id時,我可能會遇到問題,並且從評論表中拉出時,他們會互相評論。 我可以通過添加一個object_type列來解決問題,但在查詢時很難保持等。

什麼是在整個數據庫中擁有唯一行ID的最佳方法?

我注意到Facebook的號碼與他們的對象真的非常大的ID號,並可能通過id mod trillion或其他一些非常大的數字來確定它的類型。 雖然這可能工作,有沒有更多的選項來實現相同的事情,或依靠足夠大的數字範圍應該罰款?

謝謝!

+0

整個數據庫中的唯一ID是一個有趣的想法。雖然它肯定會使關係更容易,正如你正在嘗試做的那樣,它是否也會使加載對象變得更加困難?就像在每次你遇到一個ID時,你需要弄清楚它是什麼類型的對象? –

+0

大部分時間我都知道,在請求的上下文中,我需要加載哪個對象。我只是想到,在一些關係中,我不需要知道對象實際表示什麼,而是將數據分配給它。如果我猜猜Facebook的實現方法是正確的,他們可以在需要時輕鬆確定對象的類型 –

回答

3

您可以使用類似於Twitter用於其唯一ID的內容。

http://engineering.twitter.com/2010/06/announcing-snowflake.html

爲每個對象創建,你將不得不作出某種API調用該服務的,雖然。

+0

謝謝,這是一個很好的提示,但對於目前規模的項目來說,這是一個矯枉過正並且依賴於太多的東西我不想現在融入我的項目。反正非常感謝! –

0

爲什麼不把object_type的概念整合到id列中?例如,ID可以是對象類型,分隔符和列中的唯一ID的串聯。

這種方法可能會更好地擴展,因爲整個數據庫的唯一ID生成器可能會導致性能瓶頸。

+0

因爲這將需要我使用兩列來使對象和它的評論之間的關係,我試圖避免 –

0

如果你只有一個數據庫實例,您可以創建一個新表來分配的ID:

CREATE TABLE id_gen (
    id BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL 
); 

現在你可以很容易地生成新的獨特的ID,並用它們來存儲您行:

INSERT INTO id_gen() VALUES(); 
INSERT INTO foo (id, x) VALUES (LAST_INSERT_ID(), 42); 

當然,當你不得不分解這些時,你會遇到一些麻煩。您可以將管理此表的單個數據庫實例擱置一旁,但是對於所有寫入和單個I/O瓶頸(如果您必須處理地理位置不同的數據中心,這種情況只會變得更糟),您會遇到單點故障。

Instagram的ID生成方案中有一個wonderful blog post,它利用PostgreSQL的精彩和關於其特定應用程序的一些知識來生成跨越分片的唯一ID。

另一種方法是使用UUID,即extremely unlikely來表現衝突。您獲得「免費」的全球唯一性,並進行一些權衡:

  • 稍大一點:BIGINT是8字節,而UUID是16字節;
  • 索引痛苦:對未排序的鍵,INSERT更慢。 (UUID實際上是preferable to hashes,因爲它們包含時間戳排序的段。)

另一種方法(前面提到過)是使用可擴展的ID生成服務,如Snowflake。 (當然,這涉及安裝,集成和維護所述服務;這樣做的可行性高度針對項目特定)。

0

我使用表作爲對象類,行作爲對象和列作爲對象參數。一切都從類技術開始,每個對象都有唯一的標識符,這在數據庫中是唯一的。對象類被註冊爲表對象類中的對象,並且每個對象類的參數都被鏈接到它。

+0

一個例子,這將是很棒的在這裏 –

相關問題