2016-08-05 7 views
0

アドレスと緯度/経度を含むデータベースにプレイスと人物のリストを保存する必要があります。時々私は唯一の他の時間緯度/経度以外のアドレスがありません。だから私はしている:アドレスとローカリゼーションのSQLテーブル

create table dbo.Persons (
    Id int identity not null primary key clustered (Id),  
    AddressId int not null, 
    Name nvarchar (100) null, 
    Localization geography null 
) 

create table dbo.Places (
    Id int identity not null primary key clustered (Id),  
    AddressId int not null, 
    Name nvarchar (100) null, 
    Localization geography null 
) 

create table dbo.Addresses (
    Id int identity not null primary key clustered (Id),  
    CityId int not null, 
    Street nvarchar (100) null, 
    PostalCode nvarchar (100) null, 
) 

create table dbo.Cities (
    Id int identity not null primary key clustered (Id),  
    Name nvarchar (100) null 
) 

私は2つの質問がある:

  1. は私が対処する場所や人からのローカライズを移動する必要がありますか? 私はこのようなやり方をしています。

  2. データベーススキームを改善する方法はありますか?

+2

おそらくhttp://dba.stackexchange.com/に適しています。 – HoneyBadger

答えて

0

私は人からローカリゼーションを削除します。プレイスに存在します。

あなたは人が住所、ローカリゼーション、または両方を持っているかもしれないと言いますか?それが真であれば、Persons.AddressIDをヌル可能にします(アドレスがないことが有効な場合)。また、PlacesID(nullable)をPersonに追加します。

0

あなたのデータベースモデルは私にとってうまく見えます。そのAddressIdのみは、オプションで、PersonsPlacesでnullableでなければなりません。あなたは常にアドレスか緯度/経度のどちらかしか持っていないと言いますが、それは完璧と思われます。しかし、両方のフィールドが同時に満たされないようにするには、PersonsPlacesにチェック制約を追加する必要があります。

ただし、人や場所の住所と緯度経度の両方を保存できる時間が必要な場合は、Localizationを住所に移動することをお勧めします。データモデルをそのままにしておくと、アドレスを変更して対応するローカライゼーションを変更したり、その逆にしたりすることによって、矛盾が生じる可能性があります。ローカライゼーションをアドレス指定に移動するときには、アドレスが緯度/経度のみで構成され、都市が未知であるため、cityidをNULL値にする必要があります。

全体的なデザインについて:人と場所は大きく異なりますか?今のところ、それらは同じ列を含んでいます。したがって、PersonOrPlaceテーブルを1つだけ使用して、エントリが人物か場所かを示す型列を追加するか、代わりにフラグIsPersonを使用することができます。

+0

はい、場所と人物は大きく異なります...私は例を掲載しました。 –

関連する問題