【问题标题】:Object oriented model for tables in MS AccessMS Access 中表的面向对象模型
【发布时间】:2025-09-21 22:40:02
【问题描述】:

我有一个包含多个表的 MS Access 数据库。几乎所有表都包含有关不同类别项目的库存信息(有一些实用程序表存储额外信息,例如类别列表和常用查找值列表)。某些类别的物品具有特定于它们的特定数据 - 例如,体积与液体相关但与固体物体无关,但所有物体都有一个位置。我的数据库的逻辑结构是面向对象模型提供清晰性和可维护性优势的教科书示例:

  • 有一个基本表,它是一个包含所有不属于其他类别的项目的包罗万象的表。它包含几列,例如适用于任何项目的项目名称、日期、位置和注释。这将是*超类,例如class InventoryTable
  • 有针对特定类别的表格,例如针对打印机墨盒的表格。此表将包含InventoryTable 拥有的所有列,但还包括一些仅与打印机墨盒相关的专业信息,例如打印机型号、墨水颜色和品牌。该表将是一个子类,例如class PrinterCartridgeTable : InventoryTable.
  • 有时会有更深层次的继承结构。例如,可能有一个用于所有文档的表(class DocumentTable : InventoryTable,包括一个文档有多少页的额外字段),然后是另一个用于字母的表(class LetterTable : DocumentTable,其中也有用于信的发件人和收件人的列)。假设人们会在LetterTable 中查找字母,如果在那里找不到,可以尝试在DocumentTable 和*InventoryTable 中查找。

假设我的日期当前显示为MM/DD/YYYY。我想将它们更改为 ISO 格式 (YYYY-MM-DD)。目前,我必须打开我拥有的每张桌子(大约 20 张),并一一更改每张桌子的格式。如果有某种继承机制,我可以改为仅在我的*InventoryTable 中更改格式,而我的所有其他表都将继承该更改。

或者,假设我决定为所有项目存储一个名为“所有者”的新数据。这将描述谁将物品输入库存。我可以简单地将这一列添加到InventoryTable,它会自动出现在所有子表中。

最后,假设我进行了外观更改,例如重新排列列的顺序。假设在我的文档相关表格中,页码出现在末尾。相反,我将页码移动到表的最开头 - 这将传播到 DocumentTableLetterTable 但不会传播到不相关的表。

请记住,我正在使用 MS Access 2013 的 GUI 手动编辑这些表。在编辑与单个项目类别有关的信息时,我不想在表或查询之间来回切换以编辑不同部分相同的记录 - 我希望能够在一个地方查看和编辑任何给定记录的所有信息。因此,一些基于链式查询的复杂解决方案可能不切实际。

我是否可以使用某种面向对象的方案在 Access 中完成我想要的(继承结构)?是否有其他获得相同福利的方法?除了放弃并手动将每个更改传播到所有表之外,我别无选择?

【问题讨论】:

    标签: oop database-design ms-access-2013


    【解决方案1】:

    关系数据模型没有内置继承。有几种设计模式允许数据库设计者模仿关系表系统中的继承行为。两种常见的设计被称为“单表继承”和“类表继承”。该区域有两个标签,其中包含与这两种技术相关的问题,以及标签下的信息中的简要说明。使用这两种技术中的一种,您将能够对超类/子类情况进行建模。

    要获得更完整的描述,您可以在网络上搜索 Martin Fowler 对这两种技术的处理。还有第三种技术,称为“共享主键”,它允许您在子类成员和超类成员之间强制执行 IS-A 关系的一对一性质。

    您在 MS Access 中的最大问题是实现这些技术留给应用程序程序员的代码。准备好在 VBA 中进行大量编码,并将此代码绑定到用户的仪表板。

    【讨论】:

    • 基于此,听起来我应该通过将所有表放在一个大表中来使用 STI(我认为该术语是 outer join),并为类型添加一个额外的列项目(信件、文件等)。唯一的问题是我最终会得到 30-40 列,并且需要滚动很多才能查看有关记录的所有信息。
    【解决方案2】:

    无法在 Access 中创建面向对象的表,因为无法直接将方法与表关联。对象被定义为属性和方法。 Access 不是为此而设计的。

    另请注意,Access 并不是 Microsoft 所能提供的最好的。您将通过 SQL Server 获得更强大的功能。

    【讨论】:

    • 我不在乎方法。
    • @Superbest 你的问题是关于“MS Access 中表的面向对象模型”,而 * 试图提供对每个人有帮助的问题的答案。
    • 希望我的问题能帮助每个想知道 MS Access 表中的继承,但不关心支持方法的人。