【问题标题】:Create Contacts Database Which Refers to Users Without Duplicates创建引用无重复用户的联系人数据库
【发布时间】:2011-12-02 05:18:50
【问题描述】:
我的问题与这个问题相似(但同时完全不同):
Contacts Database
问题很简单:如何创建一个联系人数据库表来存储用户 ID 和联系人 ID 而无需复制键。
例如,如果我有一个名为 Contacts 的表,它将有一个列 user_id 和一个列 contact_id。
一旦我这样做了,它应该就像插入用户和添加的联系人一样简单。完成后,如何选择用户的所有联系人?另外,如果需要,我如何缩小联系人条目的范围以将其删除?
【问题讨论】:
标签:
mysql
sql
database-design
【解决方案1】:
我最终只是创建了一个包含两个外键的表,然后根据其中一个字段选择它们。
例如(伪代码--没有特定语言,只有英文):
Table Contact:
user = ForeignKey(from user table)
contact = ForeignKey(from user table)
然后,每当我需要他们的东西时,我会检查用户字段是否包含我想要的内容,然后我会检查联系人字段是否包含我想要的内容。这样我就不必重复记录,我仍然可以找到我需要的东西。
感谢您的回答。
【解决方案2】:
类似于链接中的问题。您将有 3 张桌子。
表1
User_ID
Name
PK(User_ID)
表 2
Contact_id
Address
Phone_Number
等等...
PK(Contact_id)
表3
User_ID
Contact_id
PK(User_ID, Contact_id)
在这里,您将表 2 中的 ContactID 作为 autoinc 列。
此外,在表 3 中插入时,如果有重复,MySQL 会抛出错误。
要选择所有用户联系人,请使用:
SELECT *
FROM Table_2 join Table_3
ON Table_2.Contact_id = Table_3.contact_id
WHERE Table2.User_id = <userid>
或者如果你需要一个特定的名字,那么
SELECT *
FROM Table_1 JOIN Table_2
ON Table_1.User_id = Table_2.User_id
JOIN Table_3
ON Table_2.Contact_id = Table_3.contact_id
WHERE Table1.name = <user name>
【解决方案3】:
有两个问题。
- "如何选择用户的所有联系人?"
所以你有一个表 tbl_contacts(user_id, contact_id) 它们都是你的主键,所以你不会得到重复的数据。
您想列出 user_id = 的所有联系人吗?
选择 *
FROM tbl_contacts
WHERE user_id = ?
- 您可能想澄清您的第二个问题“另外,如果需要,我如何缩小联系人条目的范围以将其删除?”
您可能还有一些属于用户联系人的其他属性,您需要使用这些属性进行搜索。(例如:contact_name 或 contact_number)并且当您通过查询获得 1 条记录时,您可以 -> DELETE FROM tbl_contact WHERE contact_id = ?
如果这不是您想要的答案,请澄清您的问题。