2

私はまだデータベースや正規化などの初心者であり、助けが必要な場合があります。ここに含まれているのは私のデータベース構造の一部です。私のアプローチは悪い考えだと思います。ここでは、私たちの国をさまざまな州に分類することができ、すべての都市/町は特定の州とバランガイ (最も近い一般的な用語は地区であると思います) の下にあります。したがって、私たちの国にいるすべての場所で、特定のバランガイ、市/町、および州が必要です。私がしたことは、テーブルのバランガイ、都市/町、州を参照するために外部キーを使用したことです。これは悪い考えですか?

、、、からtblCustomer_Addressを分離するために を作成した場合、どれくらい違いますか?Country_ID: Int FKProvince_ID: Int FKCityTown_ID: Int FKBaranggay_ID: Int FKtblCustomer

ありがとう!

tblCustomer(
  Customer_Id: Int PK
  Customer_FName: String
  Customer_MName: String
  Customer_LName: String
  Country_ID: Int FK
  Province_ID: Int FK
  CityTown_ID: Int FK
  Baranggay_ID: Int FK
  Additional_Address_Details: String
 )
tblCountry(
  Country_Id: Int PK
  Country_Name: String
)
tblProvince(
  Province_Id: Int PK
  Province_Name: String
)
tblCityTown(
  CityTown_Id: Int PK
  CityTown_Name: String
)
tblBarangay(
  Barangay_Id: Int PK
  Barangay_Name: String
)

*編集:ところで、私は言及するのを忘れていました. 私のプロジェクトの一部はレポート生成です。そのため、私が念頭に置いていたのは、場所を追跡することです。そこで、バランガイ、市/町、州ごとにテーブルを分けて、それぞれのテーブルを独自のものにすることを考えました。

4

3 に答える 3

0

さて、私には、バランガイは都市または州に存在し、都市は州に存在し、州は国に存在するように思われます。バランガイ、市、県、地方、または国のロケーションタイプと、階層内の親ロケーションを指すparentIDを持つロケーションテーブルがある構造はどうでしょうか。次に、顧客は階層内の任意の場所を指すロケーションIDを持ちます。新しい場所は、都市、州(地方の場合)の地区または国に存在するものとして追加できます。テーブルは次のようになります。

tblLocation(
LocationID int PK,
ParentID int FK references tblLocation LocationID,
LocationType int FK references tbllocationTypes,
LocationName
)

これをコメントとして追加できなかったため、より完全な実装を次に示します。

CREATE TABLE LocationType
(
    LocationTypeID int not null primary key,
    LocationTypeName varchar(20) not null unique
)
GO
CREATE TABLE Location (
    LocationID int not null primary key,
    ParentId int null references Location (LocationID),
    LocationName varchar(100),
    LocationTypeID int not null references LocationType (LocationTypeID)    
)
GO
CREATE Table Customer (
    CustomerID int not null primary key,
    FirstName varchar(50),
    MiddleName varchar(50),
    LastName varchar(50),
    LocationID int references Location (LocationID)
)
GO
CREATE TABLE City(  
    CityID int not null primary key references Location (LocationID),
    PostCode varchar(20) not null
)
GO
CREATE VIEW DetailedLocation AS 
    SELECT L.*, C.PostCode FROM Location AS L
    LEFT OUTER JOIN City AS C
    ON C.CityID = L.LocationID
于 2012-06-21T08:50:01.653 に答える
0

問題は、アドレスを正しい方法で処理していないことです。完全な住所が本当に必要ない場合 (または、ここでこれを見逃しているだけですか?)、顧客テーブルに Baranggay フィールドがあるだけで「問題ありません」。それ以外の場合は、アドレス テーブルを用意し、顧客テーブル内のアドレス ID を参照するだけです。もちろん、顧客が複数の住所を持つことができるようにする必要がある場合を除きます。その場合は、この m:n 関係に CustomerAddressRel テーブルを導入する必要があります。

とにかく、ここで住所を複数のフィールドやテーブルに分割することは無意味です。特定のバランガイは永遠に 1 つの町にのみ属し、その町は 1 つの州に属し、その州は 1 つの国に属します (国? これが複数の国に関するものである場合、バランガイは国際的な概念ではないため、とにかく別の形式が必要です!)。したがって、住所でバランガイを追跡し、バランガイが属する町と州を保存する別のテーブルを用意するだけで十分です。

長文で申し訳ありませんが、改訂版を出しても何の役にも立たないと思います。特定の決定の理由を理解し、現在のデータセットと予想されるリーチに基づいて最善の決定を下す必要があります。海外に行く可能性がある場合は、データスキームがすぐに準備ができていることを確認してください.

編集:

じゃあ、やっぱり伏せるのが一番だと思います。少なくともフィリピン人に限定し、バランガイが町に属している限り、将来を見据えて柔軟になりたい場合は、次のようにします。

tblCustomer(
    Customer_ID: Int PK
    Customer_FName: String
    Customer_MName: String
    Customer_LName: String
)

tblCustomerAddressRel(
    Customer_ID: Int FK
    Address_ID: Int Fk
    Type: (Mailing, Billing, Historic,...)
)

tblAddress(
    Address_ID: Int PK
    Baranggay_ID: Int FK
    Additional_Address_Details: String (<< this looks like a bad idea btw)
)

tblCountry(
    Country_ID: Int PK
    Country_Name: String
)

tblProvince(
    Province_Id: Int PK
    Province_Name: String
    County_ID: Int FK
)
tblCityTown(
    CityTown_ID: Int PK
    CityTown_Name: String
    Province_ID: Int FK
)
tblBarangay(
    Barangay_ID: Int PK
    Barangay_Name: String
    CityTown_ID: Int FK
)
于 2012-06-21T08:52:10.560 に答える
0

国、都市、および地区で利用可能なオプションを維持する必要があるため、かなり悪いです。

個人的にはaddresses、hCard マイクロフォーマットに従って住所コンポーネントをフィールド化するデータベース テーブルを作成するだけです。

CREATE TABLE IF NOT EXISTS `addresses` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `extended_address` varchar(128) DEFAULT NULL,
  `street_address` varchar(128) NOT NULL,
  `locality` varchar(128) NOT NULL,
  `region` varchar(128) DEFAULT NULL,
  `postal_code` varchar(128) DEFAULT NULL,
  `country_name` varchar(128) NOT NULL,
  PRIMARY KEY (`id`)
)
于 2012-06-21T08:46:16.927 に答える