2012-06-28 56 views
1

这个问题似乎很简单,但我似乎无法找到一种方法在MS Access中实现它。我有一组国家和这些国家内的一组地区。为了模拟国家或地区之间的天然气交易,我正在界定“平衡区”。这个平衡区可以是一个整个国家,也可以是一个地区,如法国北部。如何在SQL中为“B或A = B中包含的A”建模关系?

直到现在我有三个表:国家 - >地区 - >平衡区。在这个模型中,一些地区是“真实的”地区,即真实的国家子集,有些地区与这些国家相同。我使用单个字符标记来识别与国家代码结合的区域,并使用特殊字符“x”来表示这个特定区域与国家相同的事实。然而,用这种方法,我不能表达“x”是特殊的事实,并且在使用时指定整个国家。

对我而言,使用NULL看起来很自然。然而,在这种情况下,我不能在(国家,标签)上具有唯一性的索引,因为Access将允许多个(国家,NULL)记录。

有没有人有这个想法?

回答

2

看来你需要的是这样的:

enter image description here

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

在BALANCING_ZONE表,既COUNTRY_ID和REGION_ID是为空的,但CHECK强制执行他们的只有一个在任何给定的时间都是非空的。

因此,要将平衡区域连接到一个国家,只需设置BALANCING_ZONE.COUNTRY_ID,并将BALANCING_ZONE.REGION_ID保留为NULL即可。要将它连接到一个区域,请做相反的操作。


不幸的是,Access只支持部分外键的MATCH FULL行为。如果它支持MATCH SIMPLE(因为大多数的DBMS),你也可以做这样的事情:

enter image description here

在BALANCING_ZONE表,COUNTRY_ID不是空能力和REGION_NO是为空的。

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

+0

所有的答案都相当丰富,但这一个需要蛋糕。第一个变体是好的,因为我可以在国家或地区设置两个独特的索引。缺点是我必须在表格之间进行3次连接以获得外部平衡区域键,但我没有太多对象,因此应该可以管理。谢谢 ! –

1

听起来像你只需要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表

家长会是一个外国键返回到LandMass表

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

视图也没有超出视野......可以在每个级别创建可更新的视图,实质上按类型对数据进行分区。


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

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

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

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

这将使你的定义,可以由任意数量的包裹的“区域”更大的灵活性,尽管有界限。但是,您必须将这些结果与包裹未参与区域的包裹表结合起来。换句话说,所有包裹都将被视为地区,特定地区可能包含任何数量的地块。


这里的所有神奇的是(这也可以应用到你的模型,我认为)

类型栏也可以当作一个位掩码:所以,如果

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

你想要,区域X可以是一个城市和一个州,通过给它一个类型值(城市州)= 6基本的数学将是简单的:

if((Type & 4) > 0) then it's a state. 
if((Type & 2) > 0) then it's a city 
+0

问题是,我想用他们的ISO国家代码来标识所有类型为“国家”的土地群众,并且具有1-1的关系。我还希望将每个陆块归因于类型特定的关键字: - “国家/地区”用ISO代码标识 - “区域”由其国家/地区的ISO代码标识,后跟单字符标签(“ n“,”t“,无论如何)。 这对您的模型是可行的,但表达约束条件似乎相当复杂,不是吗? –

+0

@ScherrerVincent - 您可以将ISO代码添加到陆地质量表,并将其留空以用于除国家之外的任何内容,或者创建一对一关系表(陆地质量与ISO代码)并为每个国家添加条目。即使该国是一个地区,也可以很容易地创建一个视图,以便将所有国家的国际码采用ISO标准。 –

+0

@ScherrerVincent - 任何一块土地都可以参与一个地区,任何地区都可以由一块或多块土地组成。我们的模型遇到的问题是,由于一对父亲关系,他们无法跨越边界。如果要将“区域”拉出到具有多对多关系的单独表格中,那可能会更好。 –

0

使用你已有的东西 - 将你的x字段数据类型改为布尔型或等价的访问 - 0/1,真/假,是/否。创建一个新列并根据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 
相关问题