【问题标题】:How to create zero or one to many relationship using sql如何使用 sql 创建零或一对多关系
【发布时间】:2023-03-16 16:22:01
【问题描述】:

我在现有应用程序中有 EntityFramework 生成的 data model,但我想在我的数据库中创建具有相同关系的相同表。

我成功地创建了 StudentStudentAddress 之间的关系(一对零或一),其中正确的查询如下:

CREATE TABLE Student(
StudentId INT NOT NULL PRIMARY KEY,
FirstName VARCHAR(30),
LastName VARCHAR(30),
City VARCHAR(30),
State1 VARCHAR(30),
StandardId INT NOT NULL FOREIGN KEY REFERENCES Standard(StandardId));

CREATE TABLE StudentAddress(
StudentId INT,
Adress1 VARCHAR(30),
Adress2 VARCHAR(30),
City VARCHAR(30),
State VARCHAR(30),
CONSTRAINT StudentAdress_PK PRIMARY KEY(StudentId),
CONSTRAINT StudentAdress_Student_FK FOREIGN KEY(StudentId) 
REFERENCES Student(StudentId));

我的问题是考虑data model 如何在 StandardStudent 表之间创建关系(零或一对多)。

感谢您的帮助

【问题讨论】:

  • “例如在 Standard 和 Student 表之间编写零或一对多关系查询”是什么意思?
  • 事实上我想创建 StandardStudents 表之间的关系。当您查看此data model 时,您会注意到两个表之间的关系是零或一对多
  • 那么,让 Student.StandardId 可以为空?
  • 您可以从 EDMX 生成数据库创建脚本。或者从 DbContext.Database 创建一个数据库。
  • 是的,大卫·布朗

标签: sql .net entity-framework database-design relationship


【解决方案1】:

您需要第三个表来存储关系:

CREATE TABLE StandardStudenRelation (
    ID INT IDENTITY(1,1) PRIMARY KEY
    , StandardID INT NOT NULL
    , StudentID INT NOT NULL
    , CONSTRAINT Student_ID_FK FOREIGN KEY(StudentId) 
        REFERENCES Standard(StudentId)  
    , CONSTRAINT Standard_ID_FK FOREIGN KEY(StandardID) 
        REFERENCES Standard(StandardId) 
    );

【讨论】:

  • 感谢您@Russel 的回复,但您似乎没有明白我的意思。请看这个data model,我想创建 StandardStudent 表之间的关系。我正在寻找合适的查询来做到这一点。
  • 虽然答案相同:已编辑以显示学生和标准之间的第三个关系表。
【解决方案2】:

您执行此操作的方式与实现一对零或一对关系的方式相同。

到目前为止,您在StudentAddressStudent 中有一个外键。没有强制每个学生一个地址。 (您可以使用 `StudentAddress.StudentId' 上的唯一索引来做到这一点。)

所以做同样的事情。在Student 表中有一个StandardId 字段,您将拥有多个学生与零或一个标准关系。

【讨论】:

  • 请注意,StudentId 上的主键和外键约束的组合(在 StudentAddress 表声明的末尾)强制每个学生使用一个地址。
  • 谢谢@MarlinPierce,我已经在Student 中有StandardId 字段,但它被标记为not null。我刚刚删除了关键字not null,效果很好!
  • @GerdWagner 是对的。我希望 StudentAddress 表上的主键不是外键,例如 StudentAddressId。
  • 我理解您的观点@GerdWagner,但在这种情况下,没有义务为每个学生提供一个地址。当您查看data model 时,您会注意到StudentAddress 具有StudentId 作为PKFK。我所做的只是在我的数据库中重现这个数据模型。我曾经问自己,PK 在 SQL 中是否可以为空;这个例子显然给了我答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 2020-10-27
  • 2014-01-11
相关资源
最近更新 更多