1

问题看起来很简单,但我似乎找不到在 MS Access 中实现它的方法。我有一组国家,以及这些国家内部的一组地区。为了模拟国家或地区之间的气体交换,我定义了“平衡区”。这个平衡区可以是整个国家,也可以是一个地区,比如法国北部。

到目前为止,我有三个表:国家->地区->平衡区。在这个模型中,一些地区是“真实的”地区,即真实的国家子集,一些与国家相同。我使用单个字符标签结合国家代码来识别区域,并使用特殊字符“x”来表示该特定区域与国家相同的事实。但是,通过这种方法,我无法表达“x”是特殊的事实,并且在使用时,它表示整个国家。

对我来说,使用 NULL 似乎很自然。但是,在这种情况下,我不能在 (country, tag) 上有一个唯一的索引,因为 Access 将允许多个 (country, NULL) 记录。

有人对此有想法吗?

4

3 回答 3

2

看来你需要这样的东西:

在此处输入图像描述

CHECK (
    (COUNTRY_ID IS NULL AND REGION_ID IS NOT NULL)
    OR (COUNTRY_ID IS NOT NULL AND REGION_ID IS NULL)
)

在 BLANCING_ZONE 表中,COUNTRY_ID 和 REGION_ID 都可以为 NULL,但 CHECK 强制它们中的一个在任何给定时间都是非 NULL。

因此,要将平衡区域连接到一个国家/地区,只需设置 BLANCING_ZONE.COUNTRY_ID,并将 BLANCING_ZONE.REGION_ID 保留为 NULL。要将其连接到区域,请执行相反的操作。


不幸的是,Access 仅支持部分外键的MATCH FULL行为。如果它支持MATCH SIMPLE(与大多数 DBMS 一样),您还可以执行以下操作:

在此处输入图像描述

在 BALNCING_ZONE 表中,COUNTRY_ID 不能为 NULL,而 REGION_NO 可以为 NULL。

要将平衡区连接到一个国家/地区,只需设置 BLANCING_ZONE.COUNTRY_ID 并将 BLANCING_ZONE.REGION_NO 保留为 NULL。要连接到区域,请同时设置。

于 2012-06-28T14:06:23.730 回答
1

听起来您只需要一张国家和地区的表格,称之为“LandMass”、“Area”或其他。

LandMass
========
LandMassId
LandMassParentId
LandMassName
LandMassType

在这种情况下,您可以一直到一个土地所有者:

Type="LandOwner"
Parent="MyCity"

Type="City"
Parent="MyState"

Type="State"
Parent="Region"

Type="Region"
Parent="Country"

Type="Country"
Parent="Continent"

类型将是 LandMassType 表的外键

Parent 将是返回 LandMass 表的外键

您还可以创建计算列,以汇总城市级别的土地所有者类型,将城市类型汇总到州级别,等等。

视图也不例外......可以在每个级别创建可更新视图,这基本上按类型对数据进行分区。


另一方面,也许你需要这种类型的设计:

Parcel table
============
Id
ParentId
Name
Type
etc..

Region table
============
Id
Name
etc..

Parcel_Region table
===================
ParcelId
RegionId

这将使您在定义可以由任意数量的地块组成的“区域”时更加灵活,尽管有边界。但是,您必须将这些结果与宗地不参与区域的宗地表合并。换句话说,所有地块都将被视为区域,特定区域可以由任意数量的地块组成。


这就是所有魔法的所在(我认为这也可以应用于您的模型)

Type 列也可以被视为位掩码:

Type 0 = none;
Type 1 = land owner
Type 2 = city
Type 4 = state
Type 8 = country
Type 16 = continent

因此,如果您愿意,X 区可以是一个城市和一个州,方法是给它一个类型值 (City | State) = 6 基本数学很简单:

if((Type & 4) > 0) then it's a state.  
if((Type & 2) > 0) then it's a city
于 2012-06-28T13:35:25.683 回答
0

使用您所拥有的 - 将您的 x 字段数据类型更改为布尔值或访问等效值 - 0/1、True/False、Yes/No。创建一个新列并根据 X 更新数据,重命名新列,删除旧列,并将新列重命名为您选择的名称。展望未来,当您插入区域(或此 X 所在的任何地方 - 我不清楚平衡区中有什么)时,如果它是或不是子集(无论您将其命名为什么、父级等),请更新它是真还是假。

country
---------
countryid
name, decript, whatever other fields


region
--------
regionid
countryid FK
subset (0 or 1, T/F, Y/N)
name, decript, whatever other fields
于 2012-06-28T13:46:17.797 回答