序言
我正在SQL Server中创建一些表,这些表将通过来自MVC应用程序的Linq-to-entities访问,尽管它的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] }
关注与问题:
当我将这个模式加载到Entity Framework时,我发现有一种循环引用。比赛(可能)指向注册人,指向该比赛。如果我试图删除记录(虽然这可能永远不会发生),这似乎会令人讨厌。 这是一个潜在的陷阱,如果是这样,我该如何避免呢? 我不想在注册上放一个“赢家”标志,因为我是最终得到一个几乎完全为空的列...似乎很浪费。
由于注册的唯一业务限制导致竞赛注册关系为一对多, 是否可以放弃交叉引用表? 或者是这种不好的做法? (我知道它会在我的场景中起作用......但它仍然可能是糟糕的形式......)
总的来说,感觉我的解决方案有些不尽如人意,但我可能(可能)没有经验来看问题。 热切地寻求其他建议。
关闭
我知道这些问题有些模糊......我道歉。很难确切地说明为什么我的模式会以某种方式感觉错误 ...这就是我寻求你的建议的原因。
谢谢,
戴夫
答案 0 :(得分:0)
在第一个破解中,您可以正确地设计数据库 qua 数据库,即无论客户端或中间件问题如何。
Person
id
name
Contest
id
name
ContestRegistrations
personid foreign key references Person(id)
contestid foreign key references Contest(id)
Composite Primary key: (personid, contestid)
或者你可以这样做:
ContestRegistrations
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)
你的方法在这里不起作用,因为它只是想看看胜利者是否已经注册了一些比赛,而不一定是相关比赛。