是多少关系不好?这个例子怎么样?

时间:2011-11-27 05:13:58

标签: database-design

根据“数据库处理:基础,设计和实施”第11版,

  

“数据模型中N:M关系强的问题   实体是他们没有直接的代表。 N:M   关系必须始终分解为两个1:N关系   在数据库设计中使用交集表。“

好的,我明白了。但是如果您的交集表创建了多对多,那该怎么办呢?我想出了一个简单的例子。让我们看一个视频商店。视频商店有每部电影的许多副本,每部电影都有很多演员。所以,要显示数据库表:

TITLE  (The movie title.)
TitleNumber   (unique pk)
Title

VIDEO 
VideoNumber   (each copy is unique even across titles, so unique  pk)
TitleNumber  (fk)

TITLE_ACTOR
TitleNumber  (pk)
ActorNumber  (pk)
CharactorPlayed

ACTOR
ActorNumber  (pk)
FirstName
LastName

所以,假设你有三份“星球大战”的副本。还有一份失踪弧的攻略。星球大战的视频编号为1-3,攻略的视频编号为4,下一部电影或副本的编号为5。

所以我看到的问题是VIDEOTITLE_ACTOR都有TitleNumber(即电影标题)的共同点。并且这两个表允许TitleNumber的许多重复,标题的多个副本和标题可以有许多演员。所以VIDEOTITLE_ACTOR是多对多的关系。到目前为止这是正确的吗?或者复合键是否会改变它?或其他什么?

通常您使用转换表加入这些转换表,但它们已经加入。我没有看到将属性移动到没有anomolies的1:M的方法。

我花了很多天研究这个,书籍和在线。请善待我在这里学习。

2 个答案:

答案 0 :(得分:3)

关系可以图示如下:

VIDEO >-- TITLE --< TITLE_ACTOR >-- ACTOR

>--”是多对一关系,“--<”是一对多。

你是对的,将VIDEO连接到TITLE_ACTOR的查询,即使间接通过TITLE,也要将VIDEO中的N行与TITLE_ACTOR中的M行匹配,结果集将为给定的TITLE提供N * M行。如果这两个表之间没有直接的连接限制,那就是VIDEO和TITLE_ACTOR之间的笛卡尔积。


重新评论:

我展示的图表符号可以说明逻辑多对多关系与该关系的物理实现之间的区别,使用包含两个的交集表多对一的关系。例如,我们试图表示的逻辑关系如下:

       TITLE >---< ACTOR

您可以在设计关系时以这种方式绘制逻辑数据模型。

但SQL不支持存储多对多关系的方法。要将它物理存储在数据库中,我们必须使用交集表:

TITLE --< TITLE_ACTOR >-- ACTOR

对于任何逻辑多对多关系,您的物理模型会添加一个交集表并反转箭头的方向。该物理模型实现了与逻辑多对多关系相同的关系。

  

这是否意味着在图表上,我不应该显示从视频到title_actor的直接关系?

是的,我认为会有以下关系:

  • VIDEO引用TITLE(M:1)
  • TITLE_ACTOR引用TITLE(M:1)
  • TITLE_ACTOR引用ACTOR(M:1)

但是从VIDEO到TITLE_ACTOR之间存在 no 直接关系。只有通过TITLE的间接关系。

引用对应于外键约束。例如,VIDEO包含引用TITLE的外键,但VIDEO 包含(并且不需要)引用TITLE_ACTOR的外键。

FWIW,上图是我尝试制作Entity-Relationship Model的简单ASCII格式。

答案 1 :(得分:1)

  问:多对多关系不好吗?

<答:答:不,当然不是!

  

让我们带一个视频商店。视频商店每个都有许多副本   电影,每部电影都有很多演员。所以,要显示数据库   表:

     

TITLE(电影标题。)TitleNumber(唯一的pk)标题

     

VIDEO VideoNumber(每个副本在标题中都是唯一的,因此非常独特   pk)TitleNumber(fk)

     

TITLE_ACTOR TitleNumber(pk)ActorNumber(pk)CharactorPlayed

     

ACTOR ActorNumber(pk)FirstName LastName

对于视频商店,我可能只有一个表:“video_selections”:

create table video_selections (
  title varchar(20) not null,  -- EX: Star Wars
  serial_no varchar(20) not null,
  type char(1) not null, -- V)HS, D)VD, B)lu-Ray
  genre char(1) not null,
  star varchar(20) not null,
  director varchar(20) not null,
  release_date datetime not null
  checkout_date datetime,
  return_date datetime
)

这可以很容易地a)跟踪库存,b)允许基于标题,流派或明星的搜索和c)交叉引用演员(至少是主演员)和电影片名或电影类型。

另一方面,如果您要创建电影数据库,则可能需要以下表格:

table movie
  title
  release_date
  ...

table actors
  name
  birthdate
  biographical info
  ...

table roles
  movie_title
  actor_name
  ...

表格“角色”当然会模仿电影(有多个演员)和演员(可能出现在多部电影中)之间的多对多关系。

'希望这有助于...至少一点......