如何在 M:M 中强制执行 1:M 关系?

     2023-02-15     192

关键词:

【中文标题】如何在 M:M 中强制执行 1:M 关系?【英文标题】:How to enforce a 1:M relation in a M:M? 【发布时间】:2022-01-04 19:29:42 【问题描述】:

我正在设计一个数据库架构。

目前有2张桌子:

    任务(TaskID、TaskName) 描述(DescriptionID、描述)

一个任务可以有多个描述,但同一个描述不应该被多个任务共享。描述可以有 0 或 1 个任务(用户应该能够在没有任务的情况下添加描述,并且以后能够链接任务)。

选项 1:

在 Description 表中添加 TaskID 作为可为空的外键。

选项 2

相反,我可以创建另一个名为 TaskDescription(RowID, TaskID, DescriptionID) 的表。 但现在是 M:M。一个任务可以有多个描述,一个描述可以被多个任务共享。在这种情况下,如何防止多个任务共享相同的描述?

【问题讨论】:

在选项 2 中,您可以创建独立于任务的描述,即使该任务不存在。这有意义吗?使用 OPT 1 all columns NOT NULL 这使得描述可选。也不要忘记 Description_Text 上的 UNIQUE。 选项 1 还允许通过使外键为空来创建独立于任务的描述。 你好在吗? 【参考方案1】:

选项 2

相反,我可以创建另一个名为 TaskDescription(RowID, TaskID, DescriptionID) 的表。但它现在是 M:M。一个任务可以有多个描述,一个描述可以被多个任务共享。在这种情况下,如何防止多个任务共享相同的描述?

只有具有复合主键的两列(显然在两列上)就足够了另一个表,以及descriptionID 上的唯一索引,这将强制

但同一描述不应被多个任务共享

类似这样的东西(Oracle 语法;忽略它。我希望通过查看一些代码而不是阅读我的非英语母语描述更容易理解我的意思):

create table taskDescription
  (taskID         number  constraint fk_td_task references task (task_id),
   descriptionID  number  constriant fk_td_desc references description (descriptionID),
  --
  constraint pk_td primary key (taskID, descriptionID)
  );

create unique index ui1_td on taskDescription (descriptionID);

这样做,如果您尝试违反任何强制约束,数据库将处理所有内容并引发错误。

【讨论】:

从n个数中取出m个数字的所有情况,用啥算法解决,哪种效率比较高呢

...取1个数为止。b.从n个数中选取编号次小的一个数,继续执行1步,直到当前可选编号最大的数为m。下面是递归方法的实现:///求从数组a[1..n]中任选m个元素的所有组合。///a[1..n]表示候选集,n为候选集大小,n>=m>0。///b[1..M]用... 查看详情

随机森林算法原理小结

...个流派,一个是boosting,特点是各个弱学习器之间有依赖关系;一个是bagging,特点是各个弱学习器之间没依赖关系,可以并行拟合。1. bagging的原理在集成学习原理总结中,给出bagging的原理图。    Bagging的弱学习器... 查看详情

怎么从m个数中随机选择n个数

...新请求,以m/n的概率选择保存,并同从已保存的m个请求中随机选出的一个进行交换。比如这N个数为[4268103]要从中选m=4个数a=[4268103];m=4;b=a(randperm(length(a)));b=b(1:m)扩展资料:c(n,m)=c(n-1,m-1)+c(n-1,m)等式左边表示从n个元素中选取m... 查看详情

两个区间映射关系详解/c++

1、首先给一个两个区间映射的公式:2、最近做项目中频繁用到区间转换,在网上找了许多例子都只有公式介绍,没有直接可用的代码,所以自己写一个给大家参考3、直接给实现代码:structInterval   Interval():m... 查看详情

pat1008(数组循环右移问题)

...个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?输入格式:每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。输出格式:在一行中输出循环右... 查看详情

hdu2200eddy'sac难题(代码片段)

...个人都要分组),要使满足最小ac数大于最大ac数,只需要在m个人中插板即可;例如:m个人假如分别为:1,2,3,4,......m-1,m(m个人的ac数从小到大排列)只需在任意位置插板就可分为符合要求的2组:1,2,3......t,||t+1...m-1,m(1<... 查看详情

概率问题

...吧,我的朋友们,随着岁月的流逝,告诉我忠诚的船员你在干啥,汗毛直竖,手也冰凉,就在天空中是蔚蓝的哈哈本回答被提问者采纳 查看详情

14求平方和与倒数序列的部分和(代码片段)

...算序列和m?2??+1/m+(m+1)?2??+1/(m+1)+?+n?2??+1/n。输入格式:输入在一行中给出两个正整数m和n(m≤n),其间以空格分开。输出格式:在一行中按照“sum=S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范... 查看详情

关于javascript中的confirm()函数

...法后检查相关的数据,当用户点击取消按钮时,程序继续执行。源码如下://去掉两边空格function   Trim(m)while((m.length&gt;0)&amp;&amp;(m.charAt(0)==\' \'))m   =   m.substring(1, m.length);while((m.length&gt;0)&amp;&amp;(m.charAt(m.... 查看详情

noip模拟赛antipalindrome

...识点:排列组合问题。本题貌似和回文字符串没有太大的关系。仔细划一下应该就能知道最后的答案是:$ans=m*(m-1)*(m-2)*....*(m-2)$但是还是有很多坑的,数据很强一个想不到就会WA声一片。1.要特判n==1的情况此时答案就是$m%mod$。2.m... 查看详情

c语言如何创建一个按钮?做计算器用

这是一个简单计算器程序:1)创建一个对话框的应用2)向对话框中添加一个编辑框控件和十六个按钮3)在头文件声明:doublem_Num;//记录编辑框中的数据BOOLm_Time;//判断是否为第一次按下数字键charm_Operator;//保存运算符4)处理数字... 查看详情

fzu1402猪的安家中国剩余定理

FZU1402中国剩余定理的模版题,注意在CRT过程中及时取模,防止在M=m[1]∗m[2]∗m[3]……M=m[1]*m[2]*m[3]……的过程中发生乘法的溢出AC代码:#include<iostream>#include<cstdio>#include<cstring>typedef__int64int64;usingn 查看详情

组合数—学习笔记(代码片段)

定义:从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数,记作$C_n^m$,定义式为$C_n^m=\fracn!m!(n-m)!$*************************计算:令$C(i,0)=C(i,i)=1(1<=i<=n)$则有递推式$C(n,m)=C(n-1,m)+C(n-1,m-1)... 查看详情

基础算法——二分(原理细节与习题归纳整理)

...关习题核心思想:  1、确定一个区间,使目标值一定在区间内  2、找到一个性质满足:    (1)具有二段性(即可分成连续的,性质不同的两段,同一段内性质相同);    (2)答案是二段性的分界点;一、整... 查看详情

排列组合中元素有相同的怎么办

M个元素中含有相同的元素,如何得到他们的全排列(不重复排列)?元素表述:a1,a1,...a1,a2,a2,...a2,.......,an,an,...an其中,a1的个数为N1,a2的个数为N2,以此类推,总个数为M。则可以证明不重复的排列种类的数目:M!/(N1!*N2!*...*Nn!)这是... 查看详情

stl(代码片段)

...c‘]<<endl;if(m.count(1))cout<<3<<endl;return0;//仅能执行第一条if语句,打印结果为1inserter()与其它函数结合使用,使元素插入到该函数参数迭代器所指向的元素之前#include<iterator>iterator(a,a.begin());//参数分别为容器名,指... 查看详情

dp小题集(代码片段)

...可以用完,也可以不用完不巧你是一位古典音乐迷,不懂如何判定这些歌的艺术价值。于是你决定根据以下标准进行选择:1.歌曲必须按照创作的时间顺序在所有的CD盘上出现。(注:第i张盘的最后一首的创作时间要早于第i+1张盘... 查看详情

fzu1402猪的安家中国剩余定理

FZU1402中国剩余定理的模版题,注意在CRT过程中及时取模,防止在M=m[1]∗m[2]∗m[3]……M=m[1]*m[2]*m[3]……的过程中发生乘法的溢出AC代码:#include<iostream>#include<cstdio>#include<cstring>typedef__int64int64;usingnamespacestd;int6... 查看详情