2011-03-28 54 views
0

前言:
我在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] 
    } 

关切和问题:
当我装这个模式到实体框架,我发现有一个排序的循环引用。比赛指向(可能)指向注册人的注册人,该注册人指向该比赛。看起来如果我试图删除记录(尽管这可能永远不会发生),这将是一个麻烦。 这是一个潜在的陷阱,如果是的话,我该如何避免它?我不想提上登记“赢家”标志,因为我与几乎完全空值的列结束了......似乎浪费。

由于独特的注册商业约束导致比赛注册关系为一对多,所以放弃交叉参考表是否可以接受或者这是不好的做法? (我知道它会在我的情况下工作...但它仍然可能是不好的形式...)

一般来说,感觉就像我的解决方案还有待期望的,但我可能(可能)不有经验可以看到问题。 其他建议的热切追捧。

关闭:
我知道这些问题是有些模糊......我道歉。这是很难明确究竟为什么我的架构感觉错误莫名其妙...这就是为什么我要寻求你的建议。

谢谢,
戴夫

回答

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) 

但是,这留下了的人可以进入一个胜利者的可能性谁没有注册。当然,获胜者必须是注册人才能在程序上得到执行。使用声明引用完整性的数据库结构本身执行,也可以:

Contest 
. 
. 
. 
winnerid 

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

你的做法不会在这里工作,因为它只能查看是否获奖者已经注册了一些比赛,不一定是大赛题。

+0

因此,本质上来说,我通过使用交叉引用表获得的非常小的数据重复值得更清晰的结构。 – Mir 2011-03-29 00:46:04

+0

我经常在描述设计时使用“干净”这个词,但用非隐喻术语来描述情况:如果您希望强制执行,则声明性地规定“比赛获胜者必须注册参加比赛!”那么需要具有其复合PK或备用唯一密钥(personid,contestid)的ContestRegistrants表。比赛表必须有引用比赛注册人(personid,id)的复合外键(personid,contestid)以确保参赛者不仅仅注册* some *比赛,而是* * *比赛。 – Tim 2011-03-29 10:44:07