我在 Access 2010 中工作。
假设我有一个数据库可以跟踪包裹在仓库中的位置。
Table: Packages
PackageID (PK)
PackageHeight
PackageWidth
PackageWeight
PackageOwner
(etc)
现在我想显示每个包旁边的包。
例如,A 紧挨着 B 和 M。
Table: PackageNextTo
ID (PK), PackageID (Packages.PackageID, FK), NextToPackageID(Packages.PackageID, FK)
1, A, B
2, A, M
所以当我抬头时A
,我发现它就在B
and旁边M
。
但是当我向上看时B
,我也想知道它在A
...旁边,而当我向上看 M 时,我想知道它在旁边A
,例如,在...旁边T
。(但 M 和 B 不一定相邻)。我是否必须通过如下添加记录来明确定义这些关系:
Table: PackageNextTo
ID (PK, AutoIncrement), PackageID, NextToPackageID
1, A, B
2, A, M
3, B, A
4, M, A
5, M, T
6, T, M
或者有没有办法自动说 if x
is next to y
then y
is next to x
。
(或者更好的方式来完全构建这些数据!!)
用人类的术语来说,我看到上面的记录 1 和 3 之间以及上面的 5 和 6 之间的冗余,依此类推……但我不知道这对数据库来说是否冗余,或者数据库是否需要明确调用它。
如果数据库需要这个显式,有没有办法运行一个宏或查询来在定义 (A,B) 时自动创建 (B,A)?
在您建议的
PackageNextTo
表中,“ID (PK)”似乎是一个代理键,大概是一个自动编号。虽然我自己不是代理键的拥护者,但我知道有些人在关系表(连接表、链接表等)中避免使用它们。(PackageID, NextToPackageID)
无论如何,您肯定需要强制执行候选密钥(化合物),并且ID
似乎至少有一个人在这里回答感到困惑。因此,我建议您忽略它。为确保“next to”关系是单向存储
CHECK
的,请添加一个约束(或验证规则),例如要将所有“next to”关系显示为双向关系,请使用
VIEW
(或以您通常的方式创建一个 soted Query 对象)扩展它们:请注意,
CHECK
需要CREATE VIEW
ANSI -92 查询模式。创建视图如下:
(这是 Oracle 语法,可能需要针对 Access 进行修改)
您是否有任何存放包裹的位置(例如货架号/筒仓/等)?如果这样做,那么您可以在该位置有一个包含位置和包裹的表格。要查找相邻的包裹,您只需要知道位置 ID +/-1 位置即可。位置 ID 需要是唯一且连续的。
如果没有,那么您可以定义一个约束(这可能意味着使用比 Access 更强大的数据库引擎,也许是 SQL server express?)然后您可以创建一个触发器函数来检查 Y == Y 旁边的 X到 X 任何更新。
另一种选择是在您的表中创建一个链表结构,以便 X 的数据元素下一个填充,Y 的数据元素和 Y 的前一个元素具有 X,prev/next/current 字段对它们具有唯一约束。例如
然后确保放入约束或触发函数以检查 prevID 是否与前一个元素的 nextID 匹配。