Database design ';属于';db关系最佳实践?

Database design ';属于';db关系最佳实践?,database-design,Database Design,我在一个摄影网站工作。网站上的照片将始终只属于一个事件。我最初的设计是: Table: Events ID, Title, etc Table: Photos ID, ThumbnailURL, etc Table: EventPhotos EventID, PhotoID, SortOrder 这对我来说似乎很自然,但我意识到它所描述的关系实际上允许一张照片属于许多事件。我考虑过这样重构它,它只允许一张照片属于一个事件: Table: Events ID, Title, etc Tab

我在一个摄影网站工作。网站上的照片将始终只属于一个事件。我最初的设计是:

Table: Events
ID, Title, etc

Table: Photos
ID, ThumbnailURL, etc

Table: EventPhotos
EventID, PhotoID, SortOrder
这对我来说似乎很自然,但我意识到它所描述的关系实际上允许一张照片属于许多事件。我考虑过这样重构它,它只允许一张照片属于一个事件:

Table: Events
ID, Title, etc

Table: Photos
ID, EventID, SortOrder, ThumbnailURL, etc

在我看来,事件关系数据在照片表中有点脏/乱-原始设计将照片、事件和关系分开-但它确实避免了连接,它迫使我们的关系是“有一个/属于”而不是“有很多”-你怎么看?

我不能说我曾经倾向于用你的第一个选择来做类似的事情。我会选择第二个。将使用更少的查询。简单地按排序器对查询进行排序也可以


添加:我使用第一张照片的唯一原因是,如果您(至少在某一点上)愿意这样做,那么照片可以添加到多个相册中,但事实并非如此。

对于一对多关系,您的第二张照片是标准、正常、正确的方式

然而,您是否完全确定您在第一次拍摄中绘制的多对多关系不适用?我不太确定,但你比我更了解你的领域

编辑:

OP增加了一条评论


谢谢。我真的不相信照片应该属于一个以上的事件-事件是照片拍摄,每一张照片的定义是从某个拍摄,并按事件查看是浏览网站的唯一方式。我很有信心一对多是正确的

这篇评论中有几个教训,所以我想编辑这篇文章来强调这些教训

意见1。最重要的是,如果不知道两件事,就不能对模式进行建模:要建模的实际问题域,以及我们的解决方案对模型的要求

我最初的猜测是,OP的活动和图片模拟了活动中的照片显示,就像在美术馆(或网站上的图片库)中一样。在这种情况下,例如,安塞尔·亚当斯在线画廊很可能会有一些活动,其中展示了安塞尔·亚当斯的照片,标题为“亚当斯的成熟作品”、“亚当斯的结构照片”或“亚当斯的沙漠照片”。这三个事件都可能包括亚当的。由于许多照片可以在许多活动中显示,因此我们需要一个多对多结构

但是OP的“活动”是一张照片,而且很明显,正如OP所指出的,任何一张照片都是在一张照片中拍摄的

这里的教训是,在了解问题域之前,我们不能建模(或者只能临时建模)

我还建议更改表名“events”,使其更加明确。将其称为“拍摄”或“照片拍摄”,可以更清楚地了解我们在建模什么

意见2。OP的评论回答了他的反对意见,即在照片中出现事件FK是“混乱的”。OP非常敏锐地意识到,这“确实避免了连接,并且它将关系强制为‘hasinone/所属’,而不是‘hasiness’”。(避免连接是一个实现问题,正确的关系更为重要,因为这是一个建模问题。)

他还应该意识到,在我们的解决方案中,在问题领域,问一张照片是有意义的,“这张照片是在什么照片会议/活动中拍摄的”。这就是为什么它不混乱的原因:“在哪个会话中拍摄”是一个关于照片或照片属性的合法问题,FK提供了这个问题的答案。这也意味着在这种情况下,从照片到事件的FK不应该为空:照片必须有一个a照片会话,否则就不可能有照片


(这里还有几个额外的课程,关于一对多关系或多对多关系的含义,以及使FK可为空或不可为空的含义;我将在下次讨论这些内容。)

我投票赞成第二次拍摄。不需要单独的eventphotos表。

那么你的第二个设计是最干净的。对于第一个设计,你可以使用“有一个”“照片和EventPhotos表之间的关系,但这样将它们分开实在没有意义。如果将来,你认为你需要多对多的关系,那么只有在那个阶段,才能将设计更改回原来的设计

干杯,
Gra.

任何一种设计都会导致一对多关系,而你在第二种设计中得到的建议都是避免一次连接。但遵循良好的数据库设计,我更喜欢第一个。如果只有photos表需要与其他一些表的关系,那么您可以这样想。这次,此表中的eventID没有任何角色

 For samll level db design i would prefer 2 but for large or medium scale i would prefer the first.

我同意其他人的观点,即你的第二个选择是实现一对多关系(一件事,多张照片)的公认方法。面向对象的背景会让您觉得在照片表中有一个事件外键列是两个独立实体的不舒服耦合。但从关系数据库的角度来看,这就是它的工作方式

在防止照片用于多个事件的同时,保留第一选择的唯一方法是在EventPhotos的PhotoID列上放置唯一约束。事件照片和照片之间的关系将变成一对一的关系,这有点毫无意义,但您确实获得了照片和事件的解耦


您的选择,但多年成功的关系数据库设计仍将为第二种选择争论不休。

请尽您所能用标准英语回答。在回答之前,请进行拼写检查,并重新阅读您的帖子,以确保其有意义。“bot”代替“but”;“u”代替“你”;谢谢你的建议。下次我会尽力的谢谢。我真的不相信照片