添加与Access数据库的关系

时间:2009-09-10 21:04:19

标签: database ms-access

我有一个包含大量数据的MS Access数据库。它由我和我的团队正在开发的应用程序使用。但是,我们从未向此数据库添加任何外键,因为我们可以从代码本身控制关系。从来没有遇到任何问题,也许永远都不会。

然而,随着开发的进一步发展,我担心即使我们使用规范化的数据,也有可能忽视30多个表之间的所有关系。因此,至少要记录表格之间的关系是个好主意。

Altova创建了DatabaseSpy,它可以显示数据库的结构但没有关系,没有太多要显示。我仍然可以使用它来添加关系,但我不想修改数据库本身。

是否有任何软件可以通过它的结构和数据分析数据库,然后对其关系进行最佳猜测? (就像文档一样,不要修改数据库。)


此应用程序创建于10多年前,拥有超过3000名付费客户,他们都使用它。它实际上是基于文档的,使用XML文档作为内部存储。数据库仅用作存储,单个导入/导出例程将其转换回XML。不幸的是,XML结构用于文档并不是很实用,并且围绕这个XML文档有第二层将它作为对象模型公开。这个对象模型远非完美,但这是10年的开发可以对应用程序做的事情。我们确实希望改进它,但这需要时间,我们不能通过延迟新的更新来让当前用户失望。
基本上,我们坚持其当前的设计并改进它,我们需要确保事情是充分证明。这就是我现在正在做的事情。

4 个答案:

答案 0 :(得分:2)

只有30多张桌子?不应该花半小时或一小时来创建所需的所有关系。我恳请你这样做。是的,我知道您说明了那些代码检查。但是,如果你错过了一些怎么办?如果确实有孤立的记录怎么办?你怎么会知道的?或者你是否有防弹程序通过你所有的表寻找所有这些问题?

使用较大的23英寸液晶显示器并使用它。

答案 1 :(得分:1)

如果您的数据库没有在代码之外的某处定义关系,那么就没有真正的方法来猜测表之间的关系。
更糟糕的是,您无法知道关系的类型以及是否应该进行更新和删除的级联。

话虽如此,如果你遵循一些严格的规则来命名你的外键字段,那么就有可能重建关系的结构。

例如,我使用类似这样的方案:

Table Product
- Field ID          /* The Unique ID for a Product */
- Field Designation
- Field Cost

Table Order
- Field ID          /* the unique ID for an Order */
- Field ProductID
- Field Quantity

在查看Order时,很容易发现这种关系:Order.ProductIDProduct.ID相关,这可以通过代码轻松确定,通过每个字段。

如果你有一个类似的方案,那么你可以从中获得多少取决于你遵循自己的约定的程度,但它可以达到100%的准确度,尽管你可能有一些例外(你可以建立) - 在你的代码中,或者,更好的,在某处查找。)

另一种解决方案是,您的每个表的唯一ID是否遵循不同的编号方案 假设您的Order.ID实际上是遵循OR001OR002等方案,Product.ID跟{J} PD001PD002等。
在这种情况下,遍历所有表中的所有字段,您可以搜索与每个PK匹配的FK记录。

如果您遵循一个合理的约定来命名您的字段和表格,那么您可以自动发现它们之间的关系,将其存储在表格中并手动进行更正。
完成后,使用该结果表实际使用Database.CreateRelation()方法从代码构建关系(查看Access文档,其中包含示例代码)。

答案 2 :(得分:1)

您可以构建一小段VBA代码,分为两部分:

  1. 步骤1实现与database.createrelation方法的数据库关系
  2. 第2步删除了与database.delete命令
  3. 创建的所有关系

    正如托尼所说,30张表并不多,脚本应该很容易设置。完成此设置后,在步骤1之后停止该过程,运行访问记录器(tools \ analyze \ documenter)以准备好文档,启动步骤2.您的数据库将保持不变并准备好文档。

    我建议您保留此代码并定期针对您的数据库运行,以检查您的关系模型是否符合数据。

答案 3 :(得分:0)

可能有一种工具可能能够“猜测”关系,但我对此表示怀疑。坦率地说,我害怕没有适当外键的数据库以及使用Access作为DBMS的多用户应用程序。 我想应用程序必须是某种内部工具,否则我建议您转移到正确的DBMS(SQL Express是免费的)并添加外键。