2012-06-28 21 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 
相關問題