Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Sql server SQL Server中的数据库结构问题;竞赛和登记者_Sql Server - Fatal编程技术网

Sql server SQL Server中的数据库结构问题;竞赛和登记者

Sql server SQL Server中的数据库结构问题;竞赛和登记者,sql-server,Sql Server,序言: 我正在SQL Server中创建一些表,这些表将通过Linq访问MVC应用程序中的实体,尽管SQL Server可能是唯一相关的部分。我对数据库不是很有经验,在我的实现过程中出现了一些问题,这给我带来了一些危险信号。我正在寻求帮助,找出我的错误所在,并希望能就如何改进提出一些建议 业务逻辑: 无论如何,商业逻辑的要点是我有竞赛和注册者。注册人只能为通过电子邮件地址匹配实施的每个给定竞赛注册一次。他们可能会注册多个比赛,但从逻辑上讲,这是不同的注册,因为每个注册的名称/电子邮件地址组合必须

序言:
我正在SQL Server中创建一些表,这些表将通过Linq访问MVC应用程序中的实体,尽管SQL Server可能是唯一相关的部分。我对数据库不是很有经验,在我的实现过程中出现了一些问题,这给我带来了一些危险信号。我正在寻求帮助,找出我的错误所在,并希望能就如何改进提出一些建议

业务逻辑:
无论如何,商业逻辑的要点是我有竞赛和注册者。注册人只能为通过电子邮件地址匹配实施的每个给定竞赛注册一次。他们可能会注册多个比赛,但从逻辑上讲,这是不同的注册,因为每个注册的名称/电子邮件地址组合必须分开,这是一项业务要求。。。这意味着每一场比赛都是一对新人。通常情况下,我会使用交叉参考表将注册者与竞赛联系起来。。。但是,考虑到上述约束,外部参照表不会保存我可以看到的任何内容

数据逻辑:
比赛需要知道一些关于自己的数据,如标题、开始日期、结束日期等,以及比赛的获胜者,当然,这是可以为空的

注册者是一个名字,一个电子邮件地址,以及他们注册到的比赛

表格:
我不知道如何在这里最好地传达我的表结构,发布完整的MSSQL create查询似乎有点过于冗长。请原谅我,如果你不喜欢我下面的方式

Contests { id [int] [non-null] [primary key] winner [int] [nullable] [foreign key into Registrants table] ... some data columns that shouldn't be relevant, title, details, dates, etc ... } Registrants { id [int] [non-null] [primary key] contest [int] [non-null] [foreign key into Contests table] name [nvarchar(80)] [non-null] email [nvarchar(80)] [non-null] } 竞赛 { id[int][非空][主键] 获胜者[int][nullable][注册人表中的外键] …一些不应该相关的数据列,如标题、详细信息、日期等。。。 } 注册人 { id[int][非空][主键] 竞赛[int][non-null][外键进入竞赛表] 名称[nvarchar(80)][非空] 电子邮件[nvarchar(80)][非空] } 关注点和问题:
当我将这个模式加载到实体框架中时,我发现有一种循环引用。竞赛(可能)指向指向该竞赛的注册人。如果我试图删除记录,这似乎会是一个麻烦(尽管这可能永远不会发生)这是一个潜在的陷阱吗?如果是的话,我该如何避免它?我不想在注册上挂上“获胜者”的标志,因为我最终得到的列几乎完全是空的。。。看起来很浪费

由于注册的独特业务限制导致竞赛与注册的关系为一对多,放弃交叉参考表是可以接受的吗?还是这种做法不好?(我知道它在我的场景中会起作用…但它仍然可能是糟糕的形式…)

总的来说,我觉得我的解决方案有些不尽如人意,但我可能(可能)没有看到问题的经验我们急切地寻求其他建议。

关闭:
我知道这些问题有些模糊。。。我道歉。很难确切地弄清楚为什么我的模式感觉不正确。。。这就是我寻求你建议的原因

谢谢,

Dave

在第一次破解时,您将数据库作为数据库进行正确设计,即不考虑客户端或中间件问题

Person
id
name


Contest 
id
name

ContestRegistrations
personid foreign key references Person(id)
contestid foreign key references Contest(id)

Composite Primary key: (personid, contestid)
或者你可以这样做:

竞赛登记

id [primary key auto-increment]
personid   foreign key references Person(id)
contestid  foreign key references Coontest(id)

Alternate Unique Key (i.e. unique composite index) on (personid, contestid)
获胜者是另一个问题:

Contest
.
.
.
winnerid  foreign key references Person(id)
但这就使得有人有可能进入一个没有注册的获胜者。当然,获胜者必须是注册人这一点可以通过程序强制执行。也可以使用声明性引用完整性在db结构本身中强制执行它:

Contest
.
.
.
winnerid

foreign key(winnerid, id) references ContestRegistrants(personid, contestid)

你的方法在这里不起作用,因为它只看获胜者是否注册了某项竞赛,而不一定是有问题的竞赛。

因此,本质上,我通过使用交叉引用表获得的非常小的数据重复值得更干净的结构。我在描述设计时经常使用“干净”一词,但要用非隐喻性的术语来描述这种情况:如果您希望以声明的方式强制执行规则“竞赛的获胜者必须为竞赛注册!”则需要一个带有复合PK或备用唯一键(personid、竞赛ID)的竞赛注册人表。竞赛表必须有一个引用竞赛注册人(personid,id)的复合外键(personid,id),以确保参赛者不仅仅是为某项竞赛注册的,而是为竞赛注册的。