SQL Server中的数据库结构问题;比赛和注册人

时间:2011-03-28 23:24:37

标签: sql-server

序言
我正在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时,我发现有一种循环引用。比赛(可能)指向注册人,指向该比赛。如果我试图删除记录(虽然这可能永远不会发生),这似乎会令人讨厌。 这是一个潜在的陷阱,如果是这样,我该如何避免呢? 我不想在注册上放一个“赢家”标志,因为我是最终得到一个几乎完全为空的列...似乎很浪费。

由于注册的唯一业务限制导致竞赛注册关系为一对多, 是否可以放弃交叉引用表? 或者是这种不好的做法? (我知道它会在我的场景中起作用......但它仍然可能是糟糕的形式......)

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

关闭
我知道这些问题有些模糊......我道歉。很难确切地说明为什么我的模式会以某种方式感觉错误 ...这就是我寻求你的建议的原因。

谢谢,
戴夫

1 个答案:

答案 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)

你的方法在这里不起作用,因为它只是想看看胜利者是否已经注册了一些比赛,而不一定是相关比赛。