MySQL - 数据库设计 - 为用户和配置文件分离表

时间:2013-11-03 16:16:54

标签: php mysql sql database

从我在网上阅读的内容来看,我明白最好将数据拆分成更多的表格,如果可能的话,因为访问时间。

现在我有一张表,我在其中存储用户名,密码和加入日期 这就是我的表格:

'user'
'user_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
user_username VARCHAR(80) NOT NULL,
user_password VARCHAR(255) NOT NULL,
user_join_date INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (user_id) ');

我正在尝试创建一个名为profiles的新表,我想在其中存储名字,姓氏,电子邮件,年龄和性别。我认为我需要一对一的关系,所以我应该使用user_id,但我不确定如何实现它。

我应该创建另一个名为profiles的表 型材

profiles_id
first_name
last_name
email
age 
gender

和另一个应该是关系? e.g。

user_profiles
----------
user_id
profiles_id

这是对的吗? SQL如何查找user_profiles?

谢谢

6 个答案:

答案 0 :(得分:6)

不要拆分表格。只需将新列添加到现有的user表中即可。稍后您可能会发现基于实际查询和使用模式的拆分表是一个好主意,但在您拥有这类数据之前,请保持简单。

如果必须创建配置文件表,请不要创建user_profiles表。这将允许m-to-n关系,这可能不是你想要的。 user_id中的简单profiles列更好。实际上,它可以是外键和主键,以确保每个user行只有一行且只有一行profile(尽管通过拆分表,您可能仍然拥有一个用户没有个人资料)。

答案 1 :(得分:3)

通常,您创建一个关联表,就像您在一个用户可以拥有多个配置文件时所描述的user_profiles一样,和/或一个配置文件可能属于一个或多个用户。

正如您所说,one-to-oneuser之间存在profile关系。因此,您只需在user_id表中添加profile列,并将其定义为user表的外键。

然后,一个简单的JOIN将允许您同时查询两个表:

SELECT u.*, p.*
FROM user u
JOIN profile p ON u.user_id = p.user_id

答案 2 :(得分:1)

您可以在个人资料表格中添加user_id字段,在JOIN上添加user_id个表格。

SELECT user.user_username, ..., profiles.first_name, ...
FROM user
INNER JOIN profiles
ON user.user_id = profiles.user_id

这应该获取组合满足JOIN条件的那些行的信息的数据(即user.user_id = profiles.user_id)。

答案 3 :(得分:1)

在User表的ProfileId中添加一个新字段,并将其设置为Foreign Key(FK)。每次创建用户时,都必须为其分配一个配置文件(它将是配置文件表中的ProfileId PK)。 如果您还想查看用户的个人资料信息,则必须进行联接

Select username, first_name,second_name
From user u, profile p
Where u.profileId = p.profileId 

user_profiles
----------
user_id
profiles_id

用于多对多关系。例如,您想向管理员提供一些prililages,但这些特权也可以被更多的管理员。比,你必须创建第3个表来解决这个问题。这是一个示例,但您不需要这样做 。enter image description here

答案 4 :(得分:0)

user

user_id |user_username |user_password |user_join_date |profile_id

profile

profile_id |first name |last name |email |age |gender

按用户ID选择用户时:

SELECT u.*, p.* FROM user AS u INNER JOIN  `profile` AS p ON u.profile_id = p.profile_id WHERE u.user_id = 1 

但是,用户应该只有一个性别,一个年龄,一个姓名和姓氏。也许电子邮件地址可能很多。我建议您不需要连接具有1对1关系的表。而是合并这些表。

答案 5 :(得分:0)

确实,拥有多个表是个好主意。我不确定你对访问时间的意思,但还有其他优点。 - 包含密码等的用户数据库是“神圣的”,您永远不会更改其结构,并将其权限(读取,写入)限制为严格的最小值。 - 然后你可以有几个“卫星”表,如个人资料,私人信息等,它们更灵活,更不敏感,你可以随时改变。

关于您的问题本身,不需要单独的关系表。实际上这是一个非常糟糕的想法,它会使您的查询复杂化并且没有任何优势。相反,在您的配置文件数据库中,您将有一个列引用回用户ID。

users
--------
id
user_name
email
password


users_profiles
---------
id
user_id
favourite_animal