2013-11-03 178 views
1

从我在线阅读的内容来看,如果可能的话,由于访问时间的原因,最好将数据拆分为更多的表格。MySQL - 数据库设计 - 用户和配置文件的单独表格

现在我有一个表,其中我存储的用户名,密码和注册日期 这是我的表的样子:

'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) '); 

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

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

profiles_id 
first_name 
last_name 
email 
age 
gender 

,另外一个应该是什么关系?例如

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

这是正确的吗? SQL如何查找user_profiles?

感谢

+0

。 。你的第一个陈述不正确。你可以参考你在网上阅读的内容吗?有时使用多个表格会更好,有时不会。 –

回答

2

通常情况下,你创建一个关联表,像user_profiles你的描述,当一个用户可以拥有多个配置文件,和/或一个配置文件可以属于一个或多个用户。

正如你所说,在这里你有一个one-to-oneuserprofile之间的关系。因此,您可以简单地将user_id列添加到profile表中,并将其定义为user表的外键。

然后,一个简单的JOIN将让你在同一时间查询两个表:

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

我对堆栈溢出的评论感到困惑。我创建了一个名为profiles的新表,它具有:引用用户表的profiles_id,user_id,first_name ...主键(profiles_id)和外键(user_id)。现在,如果我将数据添加到表单中,我应该在什么时候运行该查询?或者实际上,它在做什么?它是否在表格之间设置某种关系?对不起,我很困惑 – mihai121

+0

它确实在创建表之间的关系,但插入和检索数据应该考虑到这个模式。你应该首先'INSERT INTO用户(...)VALUES(...)',然后检索[最后插入的id](http://php.net/manual/pdo.lastinsertid.php)和'INSERT INTO profile (user_id,...)VALUES($ last_id,...)'引用用户。 –

+0

好吧,我这样做了,但我发现最后插入的ID只适用于插入后请求它。但我有一个文件插入到用户,另一个文件插入配置文件。我能做些什么来检索last_id,以便我可以将它放入其他文件中,并将其插入配置文件中? (我真的不使用PDO,所以我用了mysql_insert_id) – mihai121

1

你可以在user_id一个user_id字段添加到您的个人资料表,并JOIN表。

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)合成信息。

4

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

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

+0

我喜欢这种方法,因为它每次要查询用户信息时都会避免加入。但是,我想知道这在数据库规范化规则方面有多好。对此有何评论? – user3308043

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关系的表格。相反,合并这些表。

0

这是事实,有一个以上的表是一个好主意。我不确定你的访问时间是什么意思,但还有其他的好处。 - 您的用户数据库包含密码等是“神圣的”,您永远不会改变其结构,并将其权限(读,写)限制在最低限度。 - 然后你可以有几个“卫星”表,如配置文件,私人信息等,这些表更加灵活,不敏感,并且可以随时更改。

关于你的问题本身,没有必要与关系单独的表。事实上,这是一个非常糟糕的主意,它会使您的查询复杂化,并且没有任何优势。相反,在您的个人资料数据库中,您将有一列引用回用户标识。

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


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

在用户表ProfileId中添加一个新字段,并将其设置为外键(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,但这些privilages也可以被更多的管理员。比,你必须创建第三个表来解决这个问题。这里是一个例子,但你不需要这样做 。 enter image description here