有没有更有效的方法在 Access 中存储 objects 的容器?

Is there a more efficient way to store containers of objects in Access?

我正在尝试在 Access 2016 中创建一个关系数据库,以保留我们办公室中存储的物品清单。它们中的大多数都放在某种盒子里,所以我决定每条记录都应该是一个 Container,它可以是一个盒子、袋子或装有多个物品的物理容器,也可以只是一个未包含的项目。例如,放在架子上的打印机仍将被视为 Container,但容器类型将是 'None'。而装满 bric-a-brac 的盒子将具有类型 "Box",并且它们的每个项目都将在单独的 table.

中枚举

每个 Container 内可以有多个 Item - 例如一个盒子可能有一包笔、一根 HDMI 电缆和一个名片夹。所有三件物品都会在 Item table 中有自己的记录,其中包含描述物品的各种属性(品牌、颜色、数量,如果有不止一件相同的物品等)。每个 Item 是通过 ContainerID 链接到它的 Container - 关系是 one-to-many.

我设想的这个设计的问题是数据冗余——因为容器既可以是文字容器也可以只是一个项目(例如打印机),在后一种情况下我必须命名 parent Container "Printer",并命名为child Item "Printer"。或者我可以将 Item 的名称字段留空,以便仅命名 Container,但我不确定这是否被认为是数据库设计中的不良做法。

另一个问题是我的设计不能很好地适应 sub-containers - 例如如果在一个更大的盒子里有一个袋子,里面还有其他东西,我只需要提供一个描述性标题 "Bag containing pens, cables ..." 我无法想象有什么方法可以使我的数据库递归,所以我不能想想这个的任何解决方案。考虑到我正在使用的盒子的大小,我会经常遇到这种情况。

所以我的问题有两个:

1) 对于我正在尝试实施的解决方案,是否有一种变通方法允许我将容器整齐地存储在容器中?

2) 是否有更高效的数据库设计来满足我要实现的目标?

你的问题肯定满足许多接近投票的可用选项,并且也可能主要吸引 opinion-based 答案,因为我确信有很多方法可以解决这个问题......不过,一个可能'recursive' 解决方案可能如下:

创建一个 Items table,其中每条记录包含一个唯一标识符 ItemID 作为主键,以及项目的各种属性(例如描述、尺寸、颜色、价值, 类型等),但也包括一个名为 ContainerIDContainer 的外键字段,可以用 Items [=46= 中另一个项目的 ItemID 填充] 本身:

这样:

  • 您的打印机示例不再是一个容器,而只是一个具有适当属性且没有冗余多余记录的项目。
  • 许多项目可以共享相同的 ContainerID 字段值,表示构成您的 'bric-a-brac' 的项目包含在同一个框中。
  • 由于 ContainerID 引用了 Items table 中的另一个项目,容器也可能有一个 ContainerID 值,允许您表示无限级别的嵌套容器:

这个问题与表示管理层次结构(或实际上,任何层次结构)的问题非常相似,如 中探讨和回答的那样。