MySQL 两个表之间有两条路由连接信息是否违反规范化规则?

MySQL Does having two routes connecting information between two tables violate normalization rules?

不确定我是否知道正确的术语,但是关于融合关系有什么错误/无效吗?

我将经常查询的内容:

  1. 活动中有哪些摄像机
  2. 哪些照片来自活动
  3. 哪些照片来自相机

对于#3,如果我也将图像直接连接到相机 table 没有错的话,我宁愿避免通过事件进行双重连接。我也无法组合这些 table,因为在实际应用程序中有更多信息。

  1. 这是否违反规范化?
  2. 是否有更好的方式来组织这些信息?

注意:"event" table 最好称为 cam_event table,加入一个未见的事件信息 table (1-n)和相机信息(1-n)。

规范化 我们通过定义足以描述所有业务情况的 predicates(由列参数化的语句模板)和 tables(每个包含从其谓词中构成真实语句的行)开始设计根据 业务规则 可能会出现这种情况。然后我们规范化。信息建模方法有意生成具有某种规范化设计的 predicates/tables。

我们只能一般性地解决您的问题,因为您没有提供足够的关于您的设计的信息:相关谓词和 tables 以及功能依赖项 (FD)、候选键 (CK)、连接依赖项 (JD)、外键 (FK) 和其他限制数据库状态的约束或限制业务情况的规则。您应该学习并使用一些信息建模方法和规范化程序来实现 5NF。 (人们可能希望从中反规范化为较低的 NF。)

FK Graphs FK "routes connecting information between two tables" & "convergence"(无论您指的是什么或听说过它们)都是无关紧要的。 FK 告诉 DBMS 强制 table 的某些子行必须作为谓词和业务规则的结果出现在某些其他子行中。典型的 DBMS 不必要地糟糕地支持定向 FK 循环,但这与寻找最佳初始设计无关。


照片 根据您的问题,您可能想要的 table 是:

-- photo PHOTO was taken by camera CAMERA at event EVENT
Shot(photo, camera, event)

据推测,其中可能包含一张 CK/PK {照片}。

Cameras/Events 要记录相机具有某些固有属性(事件分析类似),您可以添加:

-- camera CAMERA is a model MODEL and ...
CameraEtc(camera, model, ...)

否则无论他们是否在您可以添加的事件中拍摄照片,都要记录相机:

-- CAMERA identifies a camera
Camera(camera)

据推测,照片中的相机值必须出现在您添加的 table 的相机列中。所以会有来自 Photo {camera} 的 FK 引用它。

但是,如果您的相机只是在某些活动中拍摄过照片的相机,那么 select * from Camera = select camera from Shot 那么您就不需要相机了。

相机事件分配 要记录相机被指定用于某项活动,而不管某些照片是否由它在该活动中拍摄,您可以添加:

-- camera CAMERA is assigned for use at event EVENT
Assigned(camera, event)

鉴于已分配,大概必须分配镜头的相机和事件。因此,Shot 相机事件对必须出现在 Assigned 中。所以 Shot 有一个 FK {camera, event} 引用 Assigned。

Shot 的替代方法是:

-- photo PHOTO was taken by camera CAMERA
ShotCamera(photo, camera)
-- photo PHOTO was taken at event EVENT
ShotEvent(photo, event)

因为select * from Shot = select * from ShotCamera natural join ShotEvent。但是相应的约束表明必须分配照片的相机和事件,即 ShotCamera 和 ShotEvent 的自然连接在分配中有一个 FK 引用 {camera, event},即 Shot FK 所说的。由于这些 table(s) 和(尤其是在 SQL 中)约束都比较复杂,我们更喜欢 Shot 设计。

增强Predicates/Tables 要记录分配的属性,您可以使用附加的 parameters/columns 进行扩充分配。这是因为这样的 属性 每个赋值都是单值的,所以这样的列对于每个相机事件对都是单值的,所以 {camera, event} 也是扩充 [=89= 的 CK ], 碰巧规范化过程不建议分解增强的 table.

增强照片也是如此,CK 为 {photo}。

但是要记录相机的属性,而不管它们是否已分配,您应该使用增强型相机来获得额外的 parameters/columns。因为扩充赋值是有问题的:

-- camera CAMERA is a model MODEL and ... and is assigned for use at event EVENT
AssignedEtc(camera, model, ..., event)

总是这样 select * from AssignedEtc = select * from CameraEtc natural join Assigned。这是因为 tables 的自然连接包含满足其谓词连接的行。即AssignedEtc的谓词是CameraEtc的谓词ANDed with Assigned的谓词:"camera CAMERA is a model MODEL and ... and camera CAMERA is assigned for use at event EVENT"。但是,与规范化解决的 CameraEtc+Assigned 设计相比,AssignedEtc 设计有一些缺点:每次给定的相机出现时,它都必须具有相同的模型,...值。而标准化 AssignedEtc 设计会导致像 CameraEtc+Assigned 这样的设计。