0

我們的數據庫包含5+表最佳實踐:找到多個錶行的唯一ID

user 
---------- 
user_id (PK) int NOT NULL 
name varchar(50) NOT NULL 

photo 
-------- 
photo_id (PK) int NOT NULL 
user_id (FK) int NOT NULL 
title varchar(50) NOT NULL 

comment 
------- 
comment_id (PK) int NOT NULL 
photo_id int NOT NULL 
user_id int NOT NULL 
message varchar(50) NOT NULL 

所有主鍵ID是唯一的ID。

所有數據都與http://domain.com/ {} primary_key_id

用戶訪問後使用ID鏈接,這是所有表中的唯一。

我應該如何實現這個id屬於哪個表?


溶液1

select user_id from user where user_id = {primary_key_id} 

// if not found, then move next 
select photo_id from photo where photo_id = {primary_key_id} 

... continue on, until we find which table this primary key belongs to. 

溶液2

  1. 創建對象表來容納所有的uniqe ID和有數據類型
  2. 上創建觸發器的所有AFTER INSERT的表,在obj中創建行ect表及其數據類型,將其插入選定的表
  3. (如果需要),然後執行select語句以查找id所屬的表名。

第二種解決方案是雙插入。 1插入用於行與完整數據實際的表2和插入件用於插入唯一id和表名在對象表,這是我們對第1步中

select type from object_table where id = {primary_key_id} 

溶液3

  1. 前置表中創建名稱+ ID =編碼成新的獨特的整數 - 使用PHP
  2. 解碼ID並獲得與表名的原始ID(即使它只是爲數字型)

我不知道如何在PHP中實現這一點,但這個解決方案聽起來更好!你有什麼建議?

+0

您的解決方案都可以使用。問題更多的是您需要多長時間才能進行相關操作。解決方案2可能更快,但需要額外的表格,插入時也需要更多的費用。解決方案1更簡單,但需要多達5條選擇語句。順便說一句:你有沒有想過使用獨特的ID與「發言」號碼?然後你可以從編號中知道原始表格。 – luksch 2013-04-23 18:22:14

+0

你如何創建鏈接?讓你的鏈接像'http://domain.com/page.html?pk= {id}&table = {table}'(當'echo'鏈接添加表格作爲ID這樣的屬性時)。稍後,您可以解析url並在查詢中使用table屬性作爲變量。表ID在整個DB中不需要是唯一的。如果我正確理解你,你正在浪費大量可用的ID號碼。 – 2013-04-23 18:30:35

+0

@luksch即時通訊使用UUID_SHORT()爲所有表創建唯一的ID。我更喜歡解決方案3,但不知道如何實現編碼/解碼。你怎麼看? – Basit 2013-04-23 18:33:38

回答

0

我不知道你在評論中引用了Facebook的意思,但我會稍微解釋一下我的評論。

您不需要跨五個數據庫表的唯一ID,每個表只需一個。你有兩個選擇如何創建你的鏈接(你可以創建鏈接你自己可以嗎?):

  1. 使用GET變量:http://domain.com/page.html?pk={id}&table={table}
  2. 使用普通的URL:http://domain.com/{id}{table}

根據你選擇鏈接的語法來解析它的功能。例如,您可以使用以下的一種或兩種:

當你簡單的模型工作您可以添加編碼/解碼/散列函數。但是你真的需要他們嗎?在什麼水平? (我沒有那方面的經驗,所以我現在就閉嘴吧。)

+0

http://developers.facebook.com/docs/reference/api/using-pictures/向下滾動到「支持的對象的例子」,你可以看到我的意思是通過在多個表中使用唯一標識符以及我試圖執行什麼。 – Basit 2013-04-23 19:55:26

0

在表之間保持唯一性真的很重要嗎?

  • 如果沒有,只是如果你可以(例如使用URL encoding)實施解決方案3。
  • 如果,無論如何你需要「父」表,所以DBMS可以強制唯一性。
    • 您仍然可以嘗試實現最重要的是解決方案3,
    • 添加型判別 那裏,你就可以(快速)知道哪個表中被引用對於任何給定的ID。

看看的this answer下部。這實際上是一種繼承形式。