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

时间:2011-10-09 03:20:52

标签: c# sql fluent-nhibernate many-to-many

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

基本上我有三个表,一个是Meetings表,一个是MeetingPlaces表,另一个是Attendee表。基本上,该应用程序将起作用,以便建立会议,并且参加者将参加,但他们也将投票选择位置。所以基本上很多会议都有很多与会者,而且许多与会者都有很多投票(授予约束权,使得他们每次会议只有一票。看起来就像这样。所以为了表示这个,我有三个基表和一个To To很多(对很多人来说?表)

CREATE TABLE Meetings (
    Id INT NOT NULL PRIMARY KEY IDENTITY,
    Name NOT NULL,
    StartTime DATETIME NOT NULL,
    EndTime DATETIME NULL,
)

CREATE TABLE Attendees (
    Id INT NOT NULL PRIMARY KEY IDENTITY,
    Name NOT NULL
)

CREATE TABLE MeetingPlaces (
    Id INT NOT NULL PRIMARY KEY IDENTITY,
    Name NOT NULL,
    Address NULL
)

CREATE TABLE MeetingAttendees (
    Id INT NOT NULL PRIMARY KEY IDENTITY, 
    MeetingId INT NOT NULL, 
    AttendeeId INT NOT NULL, 
    MeetingPlaceId INT NULL, --in case they have no preference

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

CREATE UNIQUE INDEX U_IDX_Meeting_Attendees ON MeetingAttendees(MeetingId, AttendeeId)
GO

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

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将如何处理第一个解决方案,而第二个解决方案似乎更具结构性。

1 个答案:

答案 0 :(得分:0)

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

如果我理解你的情况:

  • 会议(会议信息)
  • 与会者(与会者信息)
  • MeetingVote(meeting_id,attendee_id,更多信息)
  • MeetingAttendee(meeting_id,attendee_id,更多信息)

这将被规范化并正确表示您的应用程序的行为。

有些人会争辩说,如果这个应用程序的阅读时间比你应该去标准化的时间长90%,那么如果你经常阅读和写作,你应该有两个独立的关联实体。

相关问题