Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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
Mysql 十对零对多关系SQL_Mysql_Database_Database Design_Foreign Keys_Relationship - Fatal编程技术网

Mysql 十对零对多关系SQL

Mysql 十对零对多关系SQL,mysql,database,database-design,foreign-keys,relationship,Mysql,Database,Database Design,Foreign Keys,Relationship,所以,我试图创建一个模型。我需要零到十个学生注册到零到多个课程。这是如何建模的?我很难理解如何在mysql中实现10的限制,或者它是通过数据库模型实现的?通常,您会在连接关系类型/类符号到参与实体类型/类符号的每一行的实体端写0..10。我们称之为(0-to-10):(0-to-10)关系。有些方法分别注释M:N或0-to-M:0-to-N加上最大M&N。您需要告诉我们您使用的方法/产品 在MySQL中,您需要通过以下方式强制实现这一点。由于参与者不能少于0人,因此只需限制最大人数。删除不能超过

所以,我试图创建一个模型。我需要零到十个学生注册到零到多个课程。这是如何建模的?我很难理解如何在mysql中实现10的限制,或者它是通过数据库模型实现的?

通常,您会在连接关系类型/类符号到参与实体类型/类符号的每一行的实体端写0..10。我们称之为(0-to-10):(0-to-10)关系。有些方法分别注释M:N或0-to-M:0-to-N加上最大M&N。您需要告诉我们您使用的方法/产品

在MySQL中,您需要通过以下方式强制实现这一点。由于参与者不能少于0人,因此只需限制最大人数。删除不能超过最大值。插入或更新给定学生或班级的行时,要求相关的BEFORE COUNT小于10。

一个学生“实体”表

一个课程“实体”表

一个“关系”表,列出哪些学生正在学习哪门课程。(多对多)


没有参加任何课程的学生将不在多对多表中。(抵制课程也是如此。)

你可以通过一个交叉表来实现这一点,该交叉表设计为每个课程最多只包含10个条目

create table CourseStudent(
    CourseID    int not null,
    StudentID   int not null,
    Card        smallint not null,
    constraint  PK_CourseStudent primary key( CourseID, StudentID ),
    constraint  CK_CourseCardinality check( Card between 1 and 10 ),
    constraint  UQ_CourseCardinality unique( CourseID, Card )
);
课程表和学生表也会有外键定义,但让我们看看我们有什么

对于任何课程,最多可以有十个条目,并且任何课程的学生不得超过一次

这种设计的弱点是卡值必须在1到10之间,并且无法自动生成,因此应用程序必须处理该值,但在应用程序代码中很容易处理。差距也是可能的,但这不应该是一个问题。卡的价值不应该暴露给用户,这样就不会有什么不对劲的地方


但是,这允许您强制执行10:n基数。

我认为您无法在db中对此进行建模。0-1关系也会出现同样的问题。