最好使用两个多对多表,或者一个表有三个外键引用
本文关键字:一个 引用 三个 两个 或者 | 更新日期: 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%以上的时间都在读取,那么你应该反规范化,但如果你经常读写,你应该有两个独立的关联实体。