从我在网上阅读的内容来看,我明白最好将数据拆分成更多的表格,如果可能的话,因为访问时间。
现在我有一张表,我在其中存储用户名,密码和加入日期 这就是我的表格:
'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?
谢谢
答案 0 :(得分:6)
不要拆分表格。只需将新列添加到现有的user
表中即可。稍后您可能会发现基于实际查询和使用模式的拆分表是一个好主意,但在您拥有这类数据之前,请保持简单。
如果必须创建配置文件表,请不要创建user_profiles
表。这将允许m-to-n关系,这可能不是你想要的。 user_id
中的简单profiles
列更好。实际上,它可以是外键和主键,以确保每个user
行只有一行且只有一行profile
(尽管通过拆分表,您可能仍然拥有一个用户没有个人资料)。
答案 1 :(得分:3)
通常,您创建一个关联表,就像您在一个用户可以拥有多个配置文件时所描述的user_profiles
一样,和/或一个配置文件可能属于一个或多个用户。
正如您所说,one-to-one
和user
之间存在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个表来解决这个问题。这是一个示例,但您不需要这样做 。
答案 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