从我在网上阅读到的内容来看,我明白了最好将数据拆分到更多的表中,如果可能的话,因为访问时间的原因。
现在我有一个表,其中我存储用户名,密码和加入日期这是我的表看起来:
'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?
谢谢
6条答案
按热度按时间agyaoht71#
不要拆分表。只需将新列添加到现有的
user
表中。稍后您可能会发现,根据实际查询和使用模式拆分表是一个好主意,但在获得此类数据之前,请保持简单。如果你必须创建一个配置文件表,不要创建
user_profiles
表。那会产生一个m到n的关系,而这可能不是你想要的。在profiles
中创建一个简单的user_id
列会更好。事实上,它可以既是外键又是主键,以确保每个user
行仅有且仅具有一个profile
行(尽管通过拆分表,您可能仍然有一个没有配置文件的用户)。rbpvctlc2#
通常,当一个用户可以拥有多个配置文件,并且/或者一个配置文件可以属于一个或多个用户时,您会创建一个 * 关联表 *,如您所描述的
user_profiles
。如前所述,在
user
和profile
之间存在one-to-one
关系,因此,只需向profile
表添加一个user_id
列,并将其定义为user
表的外键。然后,一个简单的
JOIN
将允许您同时查询两个表:htrmnn0y3#
在用户表中添加一个新字段ProfileId,并将其设置为外键(FK)。每次创建用户时,都必须为其分配一个配置文件(该配置文件将是配置文件表中的ProfileId PK)。如果还想查看用户的配置文件信息,则必须执行连接
这个
是在多对多关系中使用的。例如,您希望为一个管理员分配一些权限,但这些权限也可以分配给更多的管理员。然后,您必须创建第三个表来解决此问题。下面是一个示例,但您不需要这样做。
3duebb1j4#
您可以向配置文件表添加一个
user_id
字段,并向user_id
上的表添加JOIN
字段。这将从满足JOIN条件的行(即
user.user_id = profiles.user_id
)中获取数据组合信息。7jmck4yq5#
拥有多个表确实是一个好主意。我不知道你说的访问时间是什么意思,但还有其他好处。-你的用户数据库包含密码等是“神圣的”,你永远不会改变它的结构,你限制它的权限(读,写)到严格的最小值。-然后你可以有几个“卫星”表,如配置文件,私人消息等,这是更灵活的,不那么敏感,你可以随时改变。
关于你的问题本身,没有必要用一个单独的表来表示关系。事实上,这是一个非常糟糕的主意,它会使你的查询复杂化,而且没有任何好处。相反,在你的配置文件数据库中,你会有一个列来引用用户ID。
u5rb5r596#
表
user
表
profile
按用户ID选择用户时:
但是一个用户只能有一个性别,一个年龄,一个名字和姓氏。也许电子邮件地址可能会很多。我建议你没有必要连接有一对一关系的表。而是合并这些表。