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