我正在建立学校管理系统。基础知识如下:
将有一个学校表格,如:
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”将包含来自父学校表的值?这是正确的方法吗?
答案 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,但你希望得到漂移]