前言:
我在SQL Server中创建了一些表,这些表将通过Linq-to-entities从MVC应用程序访问,尽管事实上它是SQL Server可能是唯一相关的部分。我对数据库不是很有经验,并且在执行过程中出现了一些问题,为我提出了一些红旗。我正在帮助确定我出错的地方,并希望提供一些关于如何改进的建议。SQL Server中的数据库结构问题;竞赛和注册人
业务逻辑:
无论如何,业务逻辑的要点是,我有比赛和注册。每个通过电子邮件地址匹配执行的比赛,注册人只能注册一次。他们可能注册参加多场比赛,但从逻辑上来说,这是一种不同的注册方式,因为这是一项业务要求,每个注册的名称/电子邮件地址组合应分开存放......这意味着每场比赛都是一对新注册。通常情况下,我会使用交叉引用表将注册人链接到竞赛...但考虑到上述限制,外部参照表不会为我节省任何我可以看到的内容。
数据逻辑:
比赛需要了解一些关于自己喜欢的标题数据,开始日期,结束日期等与比赛,这当然是可空的获得者。
注册人是名称,电子邮件地址以及他们注册的比赛。
表:
我不知道如何最好地在这里交流我的表结构和发布完整的MSSQL创建查询似乎有点太冗长。请原谅我,如果你不喜欢我下面的方法...
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] }
关切和问题:
当我装这个模式到实体框架,我发现有一个排序的循环引用。比赛指向(可能)指向注册人的注册人,该注册人指向该比赛。看起来如果我试图删除记录(尽管这可能永远不会发生),这将是一个麻烦。 这是一个潜在的陷阱,如果是的话,我该如何避免它?我不想提上登记“赢家”标志,因为我与几乎完全空值的列结束了......似乎浪费。
由于独特的注册商业约束导致比赛注册关系为一对多,所以放弃交叉参考表是否可以接受?或者这是不好的做法? (我知道它会在我的情况下工作...但它仍然可能是不好的形式...)
一般来说,感觉就像我的解决方案还有待期望的,但我可能(可能)不有经验可以看到问题。 其他建议的热切追捧。
关闭:
我知道这些问题是有些模糊......我道歉。这是很难明确究竟为什么我的架构感觉错误莫名其妙...这就是为什么我要寻求你的建议。
谢谢,
戴夫
因此,本质上来说,我通过使用交叉引用表获得的非常小的数据重复值得更清晰的结构。 – Mir 2011-03-29 00:46:04
我经常在描述设计时使用“干净”这个词,但用非隐喻术语来描述情况:如果您希望强制执行,则声明性地规定“比赛获胜者必须注册参加比赛!”那么需要具有其复合PK或备用唯一密钥(personid,contestid)的ContestRegistrants表。比赛表必须有引用比赛注册人(personid,id)的复合外键(personid,contestid)以确保参赛者不仅仅注册* some *比赛,而是* * *比赛。 – Tim 2011-03-29 10:44:07