0

我已经在 Visio 2010 中构建了一个数据库 Molde 图,并试图将该图转发工程为 Schema。

我坚持修复我收到的以下警告:

 warning : 'User_Screen_SCREENS_FK1' : Relationship has cardinality other than either zero-or-one or exactly-one, yet the child columns form a key.

有问题的两个表如下:

在此处输入图像描述

Screens表是我存储此应用程序中可用的所有“屏幕”的地方,User_Screens用于控制用户可以访问的屏幕。(有单独Users的表有1 to 0 or more关系User_Screen)。

我不确定问题出在哪里以及如何解决?谁能告诉我我哪里出错了?

更新:

修改了关系并包含了所有相关表,以更好地说明下图中的问题:

在此处输入图像描述

我有错误:

 error : 'User_Screen_SCREENS_FK1' : Child column(s) not specified.

我无法摆脱的警告:

warning : 'POSITION_USERS_FK1' : Relationship has a cardinality of either zero-or-one or exactly-one, yet the child columns form part of a key.

 warning : 'User_Screen_SCREENS_FK1' : Child columns overlap with child columns of USERS_SCREENS_FK1.

 warning : 'USERS_SCREENS_FK1' : Relationship has cardinality other than either zero-or-one or exactly-one, yet the child columns form a key.
 
4

1 回答 1

0

我认为这很困惑,因为您试图将每个表中的 PK 添加为每个表中的 FK。尝试为每个表提供一个 PK、一个基本的自动编号 INT,并消除您的多列主键:

屏幕:PK:ScreenID INT | FK:位置 ID

职位: PK: PositionID INT | 职位名称 VARCHAR

User_Screens : PK: UserScreenID INT | FK:用户 ID | FK:屏幕ID

这将屏幕级信息和用户级信息分开:例如,您不需要两个表中的 positionID(如果我理解那是什么意思),它只是属于屏幕。您可以从您的加入中获取职位信息。这将为您提供给定用户的所有屏幕位置:

SELECT [PositionName] FROM UserScreens t1 JOIN Screens t2 ON t1.ScreenID = t2.ScreenID JOIN Positions t3 ON t2.PositionID = t3.PositionID WHERE t1.UserID = 12345

更新:您仍然在不需要的地方定义了太多外键。例如,Screens 表不需要 UserPK 上的 FK,因为 UserScreens 表将成为它们之间的链接。忽略非 PK 和非 FK 字段:

[Users]: UserPK
[Screens]: ScreenPK, PositionPK_FK
[UserScreen]: UserScreenPK, UserPK_FK, ScreenPK_FK

如果位置可以在用户之间更改,请将 PositionPK_FK 移动到 [UserScreen]。

于 2012-04-18T01:01:38.380 回答