2010-01-24 54 views
0

雖然我一直在寫php很長一段時間,但這總是我學到的技能,我剛剛對錶連接產生了一個小小的信心危機!使用auto_increments加入MySQL中的MyISAM表

假設一個MySQL數據庫auth含MyISAM表userspermissions

users 
- id (auto increment) 
- email 

permissions 
- id (auto increment) 
- name 

要在許多一對多(或一對多),我一直使用橋接表連接這些表像這樣:

user_permissions 
- id (auto increment) 
- user_id 
- permission_id 

(我知道的InnoDB能的關係,但它也更復雜和豬更多的內存,所以對於q的目的,我想留在MyISAM數據)

我特別的問題是:使用自動遞增鍵來連接表是否明智,還是應該生成我自己的附加鍵?

我知道,如果表損壞,我必須重建,或者如果我開始鏡像到兩個數據庫並且鍵不同步,可能會發生問題。我也知道,如果我爲每一行(要在連接中使用)生成一個唯一的散列,那麼生成一個散列並在每次數據插入之前檢查它是新的開銷。

其他人如何做到這一點?這些問題是你在實際情況中看到的嗎?

謝謝你的時間!

亞當

回答

-1

這通常是使用代理鍵(組成或自動賦值除了唯一之外沒有意義)之間的決定,和自然鍵(對於存儲的實體具有某種語義含義的鍵,如名稱或銀行賬號)。

對於你的情況,目前還不清楚是否有任何自然鍵可以工作(用戶表的每個方面都可能改變 - 結婚後名稱改變等)。如果在保持關係不變的情況下不存在關鍵字變形的可能性,則您需要一個自然鍵。一個例子就像元素週期表中的元素名稱(Au, He, Es等)(除了添加新元素之外不太可能改變,但是,嘿,任何事情都可能發生......)。

至於數據損壞,備份實際上是最好的保護,因爲任何東西都可能會損壞。在典型的操作中,無論何時遷移或同步,都可以保留主鍵。使用一個複雜的代理鍵代替db提供的自動增量會更危險,因爲它使插入變得複雜(你必須確保它的唯一性,並且可能在事務安全的方式下處理碰撞)。而且確實精心生成的替代關鍵字在數據損壞的情況下無效(無法將其與記錄相關聯)。

一個自然的PK說,用戶的電子郵件將是一個很大的開銷 - 每當電子郵件發生變化時必須更新每個關係,在兩個帳戶之間交換電子郵件地址很複雜,索引對寬值而不是整數有效。權衡傾向於傾向於自動增量鍵。

良好的書面記錄是在這裏:

http://decipherinfosys.wordpress.com/2007/02/01/surrogate-keys-vs-natural-keys-for-primary-key/

0

的加盟許可和用戶會是這樣:

SELECT  u.*, p.* 
FROM  user_permissions up 
INNER JOIN users   u 
ON   up.user_id = u.id 
INNER JOIN permissions  p 
ON   up.permission_id = p.id 

在user_permission的id列是不是真的有必要,除非你想從另一個表參照本。如果您將該ID保留,(user_id,permission_id)將是主鍵(在這種情況下不會進行自動遞增)。如果你有他獨立的id列,那麼你應該明確地添加UNIQUE約束(user_id,permission_id)

+0

謝謝,我知道怎麼做的SQL - 的問題更多的是在加入了安全使用auto_increments的。 – 2010-01-24 21:15:18

+0

我想我不明白這個問題。你是什​​麼意思「安全」?自動遞增與加入有什麼關係? – 2010-01-24 22:20:59

+0

根據這個問題,如果數據庫應該損壞或鏡像失敗,如果關係建立在auto_incremented值上,我有可能失去關係嗎? – 2010-01-24 23:38:11