6

根据我在网上阅读的内容,我了解到最好将数据拆分为更多表,如果可能的话,由于访问时间的原因。

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

'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?

谢谢

4

6 回答 6

8

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

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

于 2013-11-03T16:27:54.760 回答
3

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

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

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

SELECT u.*, p.*
FROM user u
JOIN profile p ON u.user_id = p.user_id
于 2013-11-03T16:28:29.793 回答
2

在 User 表中添加一个新字段 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

用于多对多关系。例如,您想为管理员分配一些特权,但这些特权也可以分配给更多管理员。比,你必须创建第三个表来解决这个问题。这是一个示例,但您不需要这样做。在此处输入图像描述

于 2013-11-03T16:31:02.143 回答
1

您可以将一个user_id字段添加到您的配置文件表JOINuser_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)。

于 2013-11-03T16:22:42.303 回答
1

确实,拥有一张以上的桌子是个好主意。我不确定您所说的访问时间是什么意思,但还有其他优点。- 你的用户数据库包含密码等是“神圣的”,你永远不会改变它的结构,你将它的权限(读、写)限制在严格的最低限度。- 然后,您可以拥有多个“卫星”表,例如个人资料、私人消息等,这些表更灵活、不那么敏感,并且您可以随时更改。

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

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


users_profiles
---------
id
user_id
favourite_animal
于 2013-11-03T16:28:33.087 回答
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 关系的表。而是合并这些表。

于 2013-11-03T16:28:03.570 回答