【发布时间】:2019-05-10 21:18:58
【问题描述】:
我正在尝试在 Access 2016 中创建一个关系数据库,以保留我们办公室中存储的物品的清单。它们中的大多数都装在某种盒子里,所以我决定每条记录都应该是一个Container,它可以是一个盒子、袋子或容纳多个物品的物理容器,也可以只是一个未包含的物品.例如,放在架子上的打印机仍将被视为Container,但容器的类型将为“无”。而一个装满小玩意的盒子的类型是“盒子”,并且它们的每个项目都将在单独的表中枚举。
每个Container 内可以有多个Item - 例如一个盒子可能包含一包笔、一根 HDMI 电缆和一个名片夹。所有三个项目在Item 表中都有自己的记录,其中包含描述项目的各种属性(品牌、颜色、数量,如果有多个相同的项目等)。每个Item 都通过以下方式链接到它的Container ContainerID - 关系是一对多的。
我设想这种设计的问题是数据冗余 - 因为容器既可以是文字容器,也可以只是一个项目(例如打印机),在后一种情况下,我必须将父级命名为 Container“打印机” ,并将孩子命名为Item“打印机”。或者我可以将Item 的名称字段留空,以便只命名Container,但我不确定这是否被认为是数据库设计中的不良做法。
另一个问题是我的设计不能很好地容纳子容器 - 例如如果在一个更大的盒子里有一个袋子,里面还有其他东西,我只需要提供一个描述性的标题“包含笔,电缆的袋子......”我无法想象有任何方法可以让我的数据库递归所以我想不出任何解决方案。考虑到我正在使用的盒子的大小,我会经常遇到这种情况。
所以我的问题有两个:
1) 对于我正在尝试实施的解决方案,是否有一种解决方法可以让我将容器整齐地存储在容器中?
2) 对于我想要完成的工作,是否有更有效的数据库设计?
【问题讨论】:
-
我已经编辑了这个问题,试图让它不那么“过于宽泛”,我希望能提出进一步改进的建议,而不是进一步接近投票。
-
“这个设计”到底是什么? PS 显而易见的设计,显然是您的设计,是“容器项目 [c] 包含项目 [i]”、“项目 [i] 具有描述 [d]”、“项目 [i] 具有属性 [p]”。关于“我的设计不能很好地容纳子容器”你为什么这么认为?您已经说过“每个项目都通过 ContainerID 链接到其容器”和“一个容器既可以是文字容器,也可以只是一个项目”。所以你的设计确实“巧妙地容纳了子容器”。
-
关于“好”和“我不确定这是否被认为是数据库设计中的不良做法”:我们如何回答?我们必须改写教科书。是时候阅读已出版的关于信息建模和数据库设计的学术教科书了。 (记录和使用设计的语言和工具手册不是信息建模和数据库设计的教科书。)PS“数据冗余”(如“高效”和“好”和“坏”)并不意味着任何特别的东西&无论如何,只有“坏”“数据冗余”不是“好”。
标签: ms-access database-design ms-access-2016