最好使用两个多对多表,或者一个表有三个外键引用

本文关键字:一个 引用 三个 两个 或者 | 更新日期: 2023-09-27 18:10:42

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

基本上我有三个表,一个是Meetings表,一个是MeetingPlaces表,另一个是Attendee表。基本上,应用程序将这样工作,会议设置,与会者将去,但他们也将投票选择一个位置。所以基本上,许多会议有许多与会者,并且许多与会者有许多投票(授予一个限制,即他们每次会议只有一票)。看起来是这样。为了表示这个,我有三个基本表和一个多对多(多对多?表)

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将如何处理第一种解决方案,而第二种解决方案虽然有点人为,但在结构上似乎更合理。

最好使用两个多对多表,或者一个表有三个外键引用

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

如果我理解正确的话:

  • 会议(会议信息)
  • 与会者(与会者信息)
  • MeetingVote (meeting_id, attendee_id, more info)
  • MeetingAttendee (meeting_id, attendee_id, more info)

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

有些人会认为,如果这个应用程序90%以上的时间都在读取,那么你应该反规范化,但如果你经常读写,你应该有两个独立的关联实体。