Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 这真的是一对多的关系吗?_Sql_Database_Database Design_Database Schema - Fatal编程技术网

Sql 这真的是一对多的关系吗?

Sql 这真的是一对多的关系吗?,sql,database,database-design,database-schema,Sql,Database,Database Design,Database Schema,我的PostgreSQL数据库中有三个表: User - Contains a username and password MaleProfile - Contains information related to each male user FemaleProfile - Contains information related to each female user 最初,我没有使用单独的MaleProfile和FemaleProfile表,而是使用一个Profile表。在这种情况下,我

我的PostgreSQL数据库中有三个表:

User - Contains a username and password
MaleProfile - Contains information related to each male user
FemaleProfile - Contains information related to each female user
最初,我没有使用单独的MaleProfile和FemaleProfile表,而是使用一个Profile表。在这种情况下,我会在用户表和概要文件表之间建立一对一的关系。但后来我决定,我真的需要为男性和女性分别设置个人资料表。在这种新情况下,用户表中的每条记录必须映射到MaleProfile表或FemaleProfile表中的一条且仅映射到一条记录(但不能同时映射到这两条记录)。从另一个方向看,MaleProfile表中的每条记录都映射到User表中的一条且仅一条记录。每个FemaleProfile记录也是如此

严格来说,用户表和每个概要文件表之间的关系是一对零或一。但这些关系本质上只是一对多的关系吗?在这种情况下,“多”意味着零或一(但不是多个)?如果是这样的话,我是否可以通过在MaleProfile表和FemaleProfile表中创建一个外键列(每个外键列都指向User表中的PK列),将它们表示为任意一对多关系?我是否需要向概要文件表添加任何附加约束以保持引用完整性


谢谢。

我认为您应该将employeeID号放在profile表中,并在这些表中强制实施唯一约束。虽然我真的想不出如何阻止一个人同时拥有男性和女性,但我相信这是一条正确的道路


查看与您类似的情况,但员工类型不同。

我认为您应该将employeeID号放在profile表中,并在这些表中强制实施唯一约束。虽然我真的想不出如何阻止一个人同时拥有男性和女性,但我相信这是一条正确的道路


查看以查看与您类似的情况,但员工类型不同。

只需确保男性/女性表中的引用列具有唯一性约束和外键约束。这是一种1对1/0关系,而不是1对多关系

CREATE TABLE MaleProfile
 (UserId INT NOT NULL PRIMARY KEY
 REFERENCES "User" (UserId));

只需确保阳/阴表中的引用列具有唯一性约束和外键约束。这是一种1对1/0关系,而不是1对多关系

CREATE TABLE MaleProfile
 (UserId INT NOT NULL PRIMARY KEY
 REFERENCES "User" (UserId));

为什么要将表分开?因为它们的差异太大,可能会有太多的字段为空。这需要我创建一些复杂的业务逻辑,以确保Django正确验证关联的模型。如果我可以通过每个表和用户表之间的一对多关系来实现引用完整性,那么将它们拆分似乎更干净、更简单。最好在用户表中使用布尔标志,以及指向MaleProfile或FemaleProfile主键的外键。无论是这种方式还是您描述的方式,您的应用程序都必须维护引用完整性。数据库本身无法保持引用完整性。也可以使用连接表
ID | MaleProfileID | FemaleProfileID
为什么必须将表分开?因为它们的差异太大,可能会有太多字段为空。这需要我创建一些复杂的业务逻辑,以确保Django正确验证关联的模型。如果我可以通过每个表和用户表之间的一对多关系来实现引用完整性,那么将它们拆分似乎更干净、更简单。最好在用户表中使用布尔标志,以及指向MaleProfile或FemaleProfile主键的外键。无论是这种方式还是您描述的方式,您的应用程序都必须维护引用完整性。数据库本身无法维护引用完整性。还可以使用连接表
ID | MaleProfileID | FemaleProfileID
一个后续问题。您说过我应该创建唯一约束以及FK约束。我知道引用会创建FK约束。由于UserId将引用User中的PK列(由于它是User表中的PK,因此它本身保证是唯一的),因此它是否也满足了您的唯一性要求?谢谢。第二次跟进。在Django中,最接近实现您的答案的方法是在我的MaleProfile模型中指定UserId应该是OneToOneField(我唯一的选择是OneToOne、ForeignKey和ManyToManyField)。这将在PostgreSQL中转换为“男性配置文件用户id密钥外键(用户id)引用身份验证用户(id)”。这样行吗?这意味着,当我创建MaleProfile记录时,UserID必须与auth_user(即用户)表中某一行的id字段相匹配。在回答第一个问题时:否。我所指的唯一性要求是MaleProfile中的约束。用户ID在MaleProfile中必须是唯一的,才能实现1-1关系。在第二个后续问题中,您没有提到MaleProfile的唯一性约束。UserId应该是唯一的,并且是一个外键。您说过我应该创建唯一约束以及FK约束。我知道引用会创建FK约束。由于UserId将引用User中的PK列(由于它是User表中的PK,因此它本身保证是唯一的),因此它是否也满足了您的唯一性要求?谢谢。第二次跟进。在Django中,最接近实现您的答案的方法是在我的MaleProfile模型中指定UserId应该是OneToOneField(我唯一的选择是OneToOne、ForeignKey和ManyToManyField)。这将转换为“男性配置文件用户id密钥”