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

zy1mlcev  于 2023-02-28  发布在  Mysql
关注(0)|答案(6)|浏览(178)

从我在网上阅读到的内容来看,我明白了最好将数据拆分到更多的表中,如果可能的话,因为访问时间的原因。
现在我有一个表,其中我存储用户名,密码和加入日期这是我的表看起来:

'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

另一个应该是关系,例如

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

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

agyaoht7

agyaoht71#

不要拆分表。只需将新列添加到现有的user表中。稍后您可能会发现,根据实际查询和使用模式拆分表是一个好主意,但在获得此类数据之前,请保持简单。
如果你必须创建一个配置文件表,不要创建user_profiles表。那会产生一个m到n的关系,而这可能不是你想要的。在profiles中创建一个简单的user_id列会更好。事实上,它可以既是外键又是主键,以确保每个user行仅有且仅具有一个profile行(尽管通过拆分表,您可能仍然有一个没有配置文件的用户)。

rbpvctlc

rbpvctlc2#

通常,当一个用户可以拥有多个配置文件,并且/或者一个配置文件可以属于一个或多个用户时,您会创建一个 * 关联表 *,如您所描述的user_profiles
如前所述,在userprofile之间存在one-to-one关系,因此,只需向profile表添加一个user_id列,并将其定义为user表的外键。
然后,一个简单的JOIN将允许您同时查询两个表:

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

htrmnn0y3#

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

是在多对多关系中使用的。例如,您希望为一个管理员分配一些权限,但这些权限也可以分配给更多的管理员。然后,您必须创建第三个表来解决此问题。下面是一个示例,但您不需要这样做。

3duebb1j

3duebb1j4#

您可以向配置文件表添加一个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)中获取数据组合信息。

7jmck4yq

7jmck4yq5#

拥有多个表确实是一个好主意。我不知道你说的访问时间是什么意思,但还有其他好处。-你的用户数据库包含密码等是“神圣的”,你永远不会改变它的结构,你限制它的权限(读,写)到严格的最小值。-然后你可以有几个“卫星”表,如配置文件,私人消息等,这是更灵活的,不那么敏感,你可以随时改变。
关于你的问题本身,没有必要用一个单独的表来表示关系。事实上,这是一个非常糟糕的主意,它会使你的查询复杂化,而且没有任何好处。相反,在你的配置文件数据库中,你会有一个列来引用用户ID。

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

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

u5rb5r596#

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

但是一个用户只能有一个性别,一个年龄,一个名字和姓氏。也许电子邮件地址可能会很多。我建议你没有必要连接有一对一关系的表。而是合并这些表。

相关问题