一个实体是可选的数据库关系

时间:2011-03-30 05:28:31

标签: database-design entity-relationship

我正在建立学校管理系统。基础知识如下:

将有一个学校表格,如:

id  
school_name

学校将有几个分支机构。所以有一个Branch表,其中我将school_id作为外键,例如:

id  
branch_name  
school_id

一个分支机构将有几个学生(我正在跳过课程和部分以及其他东西以使其变得简单)所以有一个学生表如下:

id
student_name
branch_id

这种情况很简单,学校必须有分支机构。我想知道如果分支不是强制性的,该怎么办?如果没有分支,那么您将如何设计学生表呢? 除了像这样的“branch_id”之外,它还有“school_id”的另一个字段吗?

id  
student_name  
branch_id  
school_id

因此,如果没有分支,那么“branch_id”将为0,而“school_id”将包含来自父学校表的值?这是正确的方法吗?

3 个答案:

答案 0 :(得分:2)

有趣的问题。您描述的情况并不适合大多数关系数据库。你有很多选择。

我建议为每所学校引入默认分支,并将学生与该分支相关联。这有点打破了你的逻辑模型 - 你建议在商业领域,一些学校没有分支机构。不确定你如何定义“学校”和“分支”,但如果这种情况是关于互联网学习的“虚拟”分支,你可以创建一个名为“互联网”的分支。 为简单起见,这是最简单的方法 - 如果你想知道哪些学生属于学校,你总是运行相同的查询;如果你想知道一个学生属于哪所学校,你总是运行相同的查询。

如果业务领域确实需要这种区别,我建议使用名为

的表
> StudentAssociation
> - studentID
> - schoolID
> - branchID

这允许您分解学生和机构之间的关系,并且您可以创建数据库触发器以仅允许一个关联(学生属于分支机构,或属于学校,但不属于两者)。

通过将StudentAssociation分解为单独的表,您还可以跟踪历史记录 - 添加反映日期的列,并且您可以跟踪学生在分支机构或学校之间的移动。

答案 1 :(得分:0)

像这样创建一个新表:

StudentBranch(student_id,branch_id)

student_id将成为关键。

答案 2 :(得分:0)

嗯,你可以说学生总是属于学校,其次是分校。

所以是的,我确实会提出一个学生表,如你所说:

id
name
school_id (NOT NULL)
branch_id (could be NULL)

学生只能成为1所学校的一部分,可能只有1个分支,所以我认为没有必要提取到不同的链接表中。

如果您想保留历史记录,我宁愿介绍一张保留以前学校/分校历史的表格,但要保持现有的学校/分校能够在学生表内立即检索。

我不确定您将在学校保留哪些数据,以及在分支级别保留哪些数据。为了确保您能够以相同的方式对待每个学生,您可以定义一个视图来处理这个问题。例如。

之类的东西
create view student_v
  as select student.name, branch.name, ... from student, branch if student.branch_id not null
  union select student.name, school.name, ... from student, school if student.branch_id is null

[伪sql,但你希望得到漂移]