数据库 请教一个 mysql 唯一索引的问题

匿名 · 2012年12月04日 · 最后由 neocanable 回复于 2012年12月08日 · 3428 次阅读

比如小组关系表 groups_links,字段为 id, invite_id, target_id, created_at, updated_at. 我希望能在 invite_id 和 target_id 两个字段上设置唯一索引。 有两种重复,一种是两条数据相同的,这个可以通过 add_index :table, [:colume1, :column2], :unique => true 设置。 还有一种是字段值互换,比如表中有一条字段是{invite_id: 1, target_id: 2}, 如果要插入的数据是{invite_id: 2, target_id: 1},怎么确保 mysql 不会重复?

说实话吧,我没有看明白啊。我相信这也是为什么有 55 个人浏览,却没有人给你留言的主要原因。能不能用中文表达一下呢? 小组关系,小组和谁的关系?从表名 groups_links 看来是 group 和 link 是多对多的关系,一个 link 属于多个 group,一个 group 有多个 link。但是为什么表字段中却没有 link_id,invited_id 和 targit_id 代表什么含义呢?

匿名 #2 2012年12月04日

是我的问题,groups_links 是小组朋友关系表,invite_id 和 target_id 都是小组 id, invite_id 是邀请方的,target_id 是接收方

匿名 #3 2012年12月04日

其实可以不说数据,就说数据插入,表中有数据{1, 2}, 我希望的是数据库不能插入{2,1},表达能力太弱了,呵呵

按照你这个思路代价太高了,换个思路得解脱。 每两个人之间只能交一次朋友,无论 A invites B 还是 B invites A,所以呢,在 relationships 表里增加一个索引字段 rela_key,这个 key 是什么呢?将两个人的 id 做一个简单的移位操作 { class User < ActiveRecord::Base

def rela_key friend #假设当前阶段用户数不会超过 0Xffff, 阶段目标哈,有这么多人已经发达了,:) left, right = self.id > friend.id ? [self.id, friend.id] : [friend.id : self.id]
left << 16 | right
end

end }

有了这个 key 你就可以判断是否跟某人已经是好友了有木有?以上解决方案仅按照楼主思路延续

匿名 #5 2012年12月07日

#4 楼 @shreadline ruby 我刚刚学,所以还不太明白你的代码,我还是 google 搜到了一些帮助:http://stackoverflow.com/questions/229447/how-to-create-a-two-sided-unique-index-on-two-fields

我的想法,其实不用加唯一索引,一个普通索引就好了,在生成关系的时候做下判断就 ok 了,干嘛将逻辑添加到数据库上呢?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号