1

問題は単純に思えますが、MS Access でそれを実装する方法が見つからないようです。私は一連の国と、それらの国内の一連の地域を持っています。国または地域間のガス交換をモデル化する目的で、「バランス ゾーン」を定義しています。このバランス ゾーンは、国全体でも、フランス北部のような地域でもかまいません。

これまで、国->地域->バランシング ゾーンの 3 つのテーブルがありました。このモデルでは、一部の地域は「実際の」地域、つまり実際の国のサブセットであり、一部は国と同一です。国コードと組み合わせて地域を識別するために単一の文字タグを使用し、この特定の地域が国と同一であることを表すために特殊文字「x」を使用しました。しかし、この考え方では、「×」が特別であり、国全体を指しているという事実を表現することはできません。

代わりに NULL を使用するのが自然に思えます。ただし、この場合、Access では複数の (国、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)
)

BALACING_ZONE テーブルでは、COUNTRY_ID と REGION_ID の両方が NULL 可能ですが、CHECK により、いつでもそのうちの 1 つだけが非 NULL であることが強制されます。

したがって、バランシング地域を国に接続するには、BALANCING_ZONE.COUNTRY_ID を設定し、BALANCING_ZONE.REGION_ID を NULL のままにします。リージョンに接続するには、逆の手順を実行します。


残念ながら、Accessは部分的な外部キーのMATCH FULL動作のみをサポートしています。MATCH SIMPLEをサポートしている場合(ほとんどの DBMS と同様)、次のようなこともできます。

ここに画像の説明を入力

BALACING_ZONE テーブルでは、COUNTRY_ID は NULL 可能ではなく、REGION_NO は NULL 可能です。

バランシング ゾーンを国に接続するには、BALANCING_ZONE.COUNTRY_ID を設定し、BALANCING_ZONE.REGION_NO を NULL のままにします。リージョンに接続するには、両方を設定します。

于 2012-06-28T14:06:23.730 に答える
1

国と地域に必要なテーブルは 1 つだけのようです。「LandMass」、「Area」などと呼んでください。

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

この状況では、1 人の土地所有者にまでたどり着くことができます。

Type="LandOwner"
Parent="MyCity"

Type="City"
Parent="MyState"

Type="State"
Parent="Region"

Type="Region"
Parent="Country"

Type="Country"
Parent="Continent"

タイプは、LandMassType テーブルへの外部キーになります

親は、LandMass テーブルに戻る外部キーになります。

都市レベルで土地所有者タイプを合計したり、都市タイプを州レベルで合計したりできる計算列を作成することもできます。

ビューも等式から外れていません...基本的にデータをタイプごとに分割する各レベルで更新可能なビューを作成できます。


一方、このタイプの設計が必要になる場合があります。

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

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

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

これにより、境界に関係なく、任意の数の区画で構成される「地域」をより柔軟に定義できます。ただし、区画がリージョンに参加していない場合は、これらの結果を区画テーブルと UNION する必要があります。つまり、すべての区画がリージョンと見なされ、特定のリージョンは任意の数の区画で構成される可能性があります。


ここにすべての魔法があります(これはあなたのモデルにも適用できると思います)

Type 列は、ビットマスクのように扱うこともできます。

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

したがって、必要に応じて、タイプ値 (City | State) = 6 を指定することで、Area X を市と州にすることができます。基本的な計算は次のように単純です。

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 が存在する場所 - 分散ゾーンに何があるかはわかりません) に挿入するときに、それがサブセットであるかどうか (名前、親など) を更新します。 true または false にします。

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 に答える