Mysql数据库表结构

Posted

技术标签:

【中文标题】Mysql数据库表结构【英文标题】:Mysql database table structure 【发布时间】:2013-11-03 11:06:10 【问题描述】:

我目前正忙于一个项目,我想在大学第二年做...这个项目是关于用户和联系人的,每个用户可以有很多联系人,很多联系人可以属于很多用户,因为我看到它作为多对多关系我想创建一个 user_contact 表。用户和联系人之间的关系可以是朋友、工作大学或家庭成员..这种关系也可以是被动或主动状态..我还想跟踪谁最后编辑了联系人的记录以及某个用户的日期

该系统将在某家公司内部使用,该系统旨在显示用户与公司外部联系人之间的关系,例如 john 正在搜索适用于可乐可乐的 pam,他看到了与该公司合作的 phil他也知道pam是朋友,并且关系处于活跃状态..

我当前的表结构:

//User table

user_id | username|password|fname|lname|email

//Contact_table
contact_id|fname|lname|contactnumber|email|lastedited|editdate

//User_contact table
id|user_id|contact_id|relationship_type|relationship_state

由于我是 mysql 环境的新手,所以我的问题是我要走正确的路...任何建议都会非常有帮助..

我如何将用户表中的用户 ID 链接到 user_contact 表中的用户 ID 以及联系人 ID 相同??

【问题讨论】:

看起来不错。然而,将关系类型分开将允许扩展 如果用户 a 和 b 都链接到联系人 1(联系人号码为 1234),但随后用户 a 将其联系人号码更改为 1235,会发生什么...不是说设计不对,而是尝试还要考虑所有可能的关系变化? 嗨,thanx 的评论,这就是我想跟踪哪个用户对联系人记录进行最后更改的方式,例如,john 和 phil 在同一家公司工作,所以如果您单击 john,您将看到他认识的所有联系人,例如 pam 和 phil 一样。如果您查看联系信息,您将看到她的所有信息,并且约翰确实对她的记录进行了最后一次更改,因此约翰将对错误信息负责... 【参考方案1】:

联系人的版本应该是一个单独的表以避免部分依赖。 此外,最好把人放在人身上,所以你不需要联系人表 如果你打算使用 InnoDB,你应该建立外键约束来将 person_id 从联系人和版本表链接到 person 表。 类似的东西:

CREATE TABLE editions (
edit_id INT AUTO_INCREMENT PRIMARY KEY,
contact_id INT,
editor_id INT,
editdate DATE,
FOREIGN KEY (contact_id) REFERENCES contacts(contact_id),
FOREIGN KEY (editor_id) REFERENCES users(person_id)
);

CREATE TABLE contacts (
person_id INT,
contact_id INT,
relationship_type ENUM("friend", "work", "family"),
relationship_state CHAR(1),
FOREIGN KEY (person_id) REFERENCES persons(person_id),
FOREIGN KEY (contact_id) REFERENCES persons(person_id)
);

CREATE TABLE persons (
person_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(15) UNIQUE NOT NULL,
password VARCHAR(15) NOT NULL,
fname VARCHAR(15),
lname VARCHAR(25),
email VARCHAR(50) UNIQUE NOT NULL,
contactnumber VARCHAR(15)
);

【讨论】:

【参考方案2】:

您要创建的“链接”称为foreign key,可以在您的CREATE TABLE 语句中声明。您可能还想从User_Contact 表中删除多余的id,并将关系本身声明为主键。例如,

CREATE TABLE User_Contact(
  user_id INT NOT NULL REFERENCES `User`(user_id),
  contact_id INT NOT NULL REFERENCES `Contact`(contact_id),
  -- other columns
  PRIMARY KEY (user_id, contact_id)
);  

这告诉 DBMS User_Contact 中的 user_ids 来自 User。在 MySQL 中,这些约束是否实际执行取决于which storage engine you've chosen。 InnoDB 强制执行它们; MyIASM 没有。

【讨论】:

另外,我不确定您是否需要在 user_contact 表中单独使用 id。您可以创建一个由user_idcontact_id 组成的复合主键,因为用户将与联系人有唯一的关系。 @Antimony 这是 DB 人之间正在进行的圣战,但我倾向于同意你的观点。我会更新答案以包含该建议。

以上是关于Mysql数据库表结构的主要内容,如果未能解决你的问题,请参考以下文章

mysql 怎样导出一个表的结构和数据

如何从mysql数据库中获取一个表的表结构

如何修改mysql数据库表结构

mysql怎么查看表结构和注释

如何比较mysql数据库的表结构和表内容的差异

mysql 如何查询一个带有树结构的表的数据