有没有更有效的方法在 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
作为主键,以及项目的各种属性(例如描述、尺寸、颜色、价值, 类型等),但也包括一个名为 ContainerID
或 Container
的外键字段,可以用 Items
[=46= 中另一个项目的 ItemID
填充] 本身:
这样:
- 您的打印机示例不再是一个容器,而只是一个具有适当属性且没有冗余多余记录的项目。
- 许多项目可以共享相同的
ContainerID
字段值,表示构成您的 'bric-a-brac' 的项目包含在同一个框中。
- 由于
ContainerID
引用了 Items
table 中的另一个项目,容器也可能有一个 ContainerID
值,允许您表示无限级别的嵌套容器:
这个问题与表示管理层次结构(或实际上,任何层次结构)的问题非常相似,如 中探讨和回答的那样。
我正在尝试在 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
作为主键,以及项目的各种属性(例如描述、尺寸、颜色、价值, 类型等),但也包括一个名为 ContainerID
或 Container
的外键字段,可以用 Items
[=46= 中另一个项目的 ItemID
填充] 本身:
这样:
- 您的打印机示例不再是一个容器,而只是一个具有适当属性且没有冗余多余记录的项目。
- 许多项目可以共享相同的
ContainerID
字段值,表示构成您的 'bric-a-brac' 的项目包含在同一个框中。 - 由于
ContainerID
引用了Items
table 中的另一个项目,容器也可能有一个ContainerID
值,允许您表示无限级别的嵌套容器:
这个问题与表示管理层次结构(或实际上,任何层次结构)的问题非常相似,如