C# 最好使用两个多对多表或一个带有三个外键引用的表

C# 最好使用两个多对多表或一个带有三个外键引用的表,c#,sql,fluent-nhibernate,many-to-many,C#,Sql,Fluent Nhibernate,Many To Many,我正在创建一个WCF Web服务,并使用Fluent Nhibernate映射我的域模型,我注意到对象可以用不同的方式表示,它背后的数据也可以用不同的方式表示 基本上我有三张桌子,一张是会议桌,一张是会场桌,另一张是与会者桌。基本上,该应用程序的工作方式是设置会议,与会者可以去,但他们也可以投票选择地点。因此,基本上很多会议都有很多与会者,很多与会者都有很多投票权(被赋予了一个限制,使得他们每次会议只有一票。看起来是这样的。为了表示这一点,我有三个基本表和一个多对多(对多?表) 我的问题是,使用

我正在创建一个WCF Web服务,并使用Fluent Nhibernate映射我的域模型,我注意到对象可以用不同的方式表示,它背后的数据也可以用不同的方式表示

基本上我有三张桌子,一张是会议桌,一张是会场桌,另一张是与会者桌。基本上,该应用程序的工作方式是设置会议,与会者可以去,但他们也可以投票选择地点。因此,基本上很多会议都有很多与会者,很多与会者都有很多投票权(被赋予了一个限制,使得他们每次会议只有一票。看起来是这样的。为了表示这一点,我有三个基本表和一个多对多(对多?表)

我的问题是,使用此结构还是创建两个单独的表更好。一个代表会议的与会者,另一个代表与会者对会议与会者的投票:

CREATE TABLE MeetingAttendees
    Id INT NOT NULL PRIMARY KEY IDENTITY, 
    MeetingId INT NOT NULL, 
    AttendeeId INT NOT NULL, 

    CONSTRAINT  FK_MeetingAttendees_To_Events FOREIGN KEY (MeetingId) REFERENCES Meetings(Id),
    CONSTRAINT  FK_MeetingAttendees_To_Attendees FOREIGN KEY (AttendeeId) REFERENCES Attendees(Id),
)
GO

CREATE UNIQUE INDEX U_IDX_Meeting_Attendees ON MeetingAttendees(MeetingId, AttendeeId)

CREATE TABLE AttendeeVote(
    Id INT NOT NULL PRIMARY KEY IDENTITY,
    MeetingAttendeeId INT NOT NULL,
    MeetingPlaceId INT NULL,

    CONSTRAINT FK_AttendeeVote_To_MeetingAttendees FOREIGN KEY (MeetingAttendeeId) REFERENCES MeetingAttendees(Id),
    CONSTRAINT FK_AttendeeVote_To_MeetingPlaces FOREIGN KEY (MeetingPlaceId) REFERENCE MeetingPlaces(Id)
)

我之所以担心,是因为我不确定Fluent NHibernate会如何处理第一个解决方案和第二个解决方案,而稍微做作似乎在结构上更合理。

在每个多对多关系之间应该有一个关联实体

如果我正确理解你的情况:

  • 会议(会议信息)
  • 与会者(与会者信息)
  • 会议投票(会议id、与会者id、更多信息)
  • 会议与会者(会议id、与会者id、更多信息)
这将被规范化并正确地表示应用程序的行为


有些人可能会争辩说,如果此应用程序在90%以上的时间内阅读,则应取消正常化,但如果您定期阅读和写作,则应具有两个独立的关联实体。

在您列出的情况下,MeetingVote和MeetingAttender是相同的,不确定您在示例中看到的MeetingVote应该是什么。我可能会误解了您的问题。MeetingVote表将表示某人何时投票给会议?MeetingAttender将表示某人何时出席会议。噢,抱歉,MeetingVote应为Attender Vote。它是指(对于会议)的与会者在会议应该举行的地点之前进行投票。因此,会议、与会者和地点相互关联是我的第一个解决方案。啊,好吧。我认为仅使用一个关联实体的假设是,与会者必须出席会议并为某个地点投票。这是正确的吗?事实上,很好,我完全忽略了这一点。我猜是attendee不必去开会,他们真的应该是“会员”,并且他们作为与会者的分类取决于关联表。我想我可以在作为MeetingAttenders的会议成员之间创建第一个关联表,然后在作为MeetingAttenders的会议成员和地点之间创建第二个关联表。这样,会议可以是可选的,并且我可以限制参加会议的成员以一个唯一的索引结束一次投票。听起来像吗?
CREATE TABLE MeetingAttendees
    Id INT NOT NULL PRIMARY KEY IDENTITY, 
    MeetingId INT NOT NULL, 
    AttendeeId INT NOT NULL, 

    CONSTRAINT  FK_MeetingAttendees_To_Events FOREIGN KEY (MeetingId) REFERENCES Meetings(Id),
    CONSTRAINT  FK_MeetingAttendees_To_Attendees FOREIGN KEY (AttendeeId) REFERENCES Attendees(Id),
)
GO

CREATE UNIQUE INDEX U_IDX_Meeting_Attendees ON MeetingAttendees(MeetingId, AttendeeId)

CREATE TABLE AttendeeVote(
    Id INT NOT NULL PRIMARY KEY IDENTITY,
    MeetingAttendeeId INT NOT NULL,
    MeetingPlaceId INT NULL,

    CONSTRAINT FK_AttendeeVote_To_MeetingAttendees FOREIGN KEY (MeetingAttendeeId) REFERENCES MeetingAttendees(Id),
    CONSTRAINT FK_AttendeeVote_To_MeetingPlaces FOREIGN KEY (MeetingPlaceId) REFERENCE MeetingPlaces(Id)
)