Php MySQL-数据库设计-针对用户和配置文件的单独表

Php MySQL-数据库设计-针对用户和配置文件的单独表,php,mysql,sql,database,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 NU

从我在线阅读的内容中,我了解到,如果可能的话,由于访问时间的原因,最好将数据拆分成更多的表

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

'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的新表,我想在其中存储名字、姓氏、电子邮件、年龄和性别。我认为我需要一对一的关系,所以我应该使用用户id,但我不确定如何实现它

我应该创建另一个名为profiles的表吗 轮廓

profiles_id
first_name
last_name
email
age 
gender
另一个应该是关系?e、 g

user_profiles
----------
user_id
profiles_id
是这样吗?SQL如何查找用户配置文件


谢谢

您可以在profiles表中添加一个
user\u id
字段,并
加入
user\u id
上的表

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

这应该从满足连接条件的行(即
user.user\u id=profiles.user\u id
)中获取数据组合信息。

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


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

表格
用户

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关系的表。而不是合并这些表。

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

正如您所说,这里您在
用户
配置文件
之间有一种
一对一的关系。因此,您只需将
user\u id
列添加到
profile
表中,并将其定义为
user
表的外键

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

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

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

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

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


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

在用户表中添加一个新字段ProfileId,并将其设置为外键(FK)。每次创建用户时,都必须为其分配一个配置文件(这将是profile表中的ProfileId主键)。 如果您还想查看用户的配置文件信息,则必须进行连接

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

在多对多关系中使用。例如,您希望将一些特权分配给管理员,但这些特权也可以分配给更多管理员。然后,您必须创建第三个表来解决此问题。这里有一个例子,但你不需要这样做
.

。你的第一句话不正确。你能参考你在网上读到的东西吗?有时使用多个表更好,有时不行。我被关于堆栈溢出的评论弄糊涂了。我创建了一个名为profiles的新表,它有:profiles\u id、user\u id、first\u name。。。引用用户表的主键(profiles_id)和外键(user_id)。现在,如果我将数据添加到表单中,我应该何时运行该查询?或者实际上,它在做什么?它是否在表之间设置了某种关系?很抱歉如此混乱,这确实是在表之间创建关系,但插入和检索数据时应考虑此模式。您应该首先
插入到用户(…)值(…)
,然后检索并
插入到配置文件(用户id,…)值($last_id,…)
,并引用用户。好的,我这样做了,但我发现只有在插入后我要求时,最后插入的id才起作用。但是我有一个文件用于插入用户,另一个文件用于插入配置文件。如何检索最后一个_id,以便将其保存在另一个文件中,在该文件中插入配置文件?(我没有真正使用PDO,所以我使用了mysql\u insert\u id)给我这个错误,无法添加或更新子行:外键约束失败(
projectdb
profiles
,constraint
tb\u fk
外键(
user\u id
)引用
user
user\u id
)我喜欢这种方法,因为它避免了每次需要查询用户信息时的连接。然而,我想知道这在数据库规范化规则方面有多好。对此有何评论?
user_profiles
----------
user_id
profiles_id