型フィールドのINTまたはCHAR


19

テーブルまたはTypeフィールドの最適な設計は何ですか?言い換えれば、このスキーマが与えられた場合:intchar(1)

create table Car
(
    Name varchar(100) not null,
    Description varchar(100) not null,
    VehType .... not null
)

それがために(パフォーマンス的に)、より効率的でVehTypeあることをintchar(1)?5種類の車があり、0〜4の増分値を使用するか、タイプの文字(たとえば、「v」、「s」、「c」、「t」、「m」)を使用する必要があるとします。

それ以上の場合は、別のTypeテーブルを使用して外部キー関係を作成しますが、その必要性はわかりません。

私がいることがわかりsys.objectsカタログビューが文字使用するtypeフィールドを。その理由はありますか?私はただここで薄い空気をつかんでいますか、それは私がより快適なものですか?

回答:


20

通常、1バイトのtinyintを使用します

  • 比較では照合を使用するため、char(1)はわずかに遅くなります

  • 混乱:S:SUV、サルーン、セダン、スポーツとは何ですか?

  • 文字を使用すると、タイプを追加するときに制限されます。最後のポイントを参照してください。

  • 私が見たすべてのシステムには、レポートなど、複数のクライアントがあります。V、Sを「Van」、「SUV」などに変更するロジックを繰り返す必要があります。ルックアップテーブルを使用すると、単純なJOINになります

  • 拡張性:ルックアップテーブルに1つの行を追加したり、多くのコードや制約を変更したりするために、もう1つのタイプ(「空飛ぶ車」の「F」)を追加します。クライアントコードもV、S、Fなどが何であるかを知る必要があるため

  • メンテナンス:ロジックは、データベース制約、データベースコード、クライアントコードの3つの場所にあります。ルックアップと外部キーを使用すると、1つの場所に配置できます

単一の文字を使用するプラス面...えー、何も表示されません

注:Enumsに関連するMySQLの質問があります。推奨事項は、ルックアップテーブルも使用することです。


2
素晴らしい点。他の人が(sys.objectsのように)char(1)を使用するのはなぜだろうと思います。
トーマスストリンガー

2
sys.objectsには、SybaseとSQL Serverの初期バージョンに遡るレガシーがありますen.wikipedia.org/wiki/Microsoft_SQL_Server#Genesisシステムオブジェクトを見ると、IDではなくコード全体を見ることができますが、新しいDMVではそうではありません。MS以外の他の人々は?OO / EnumではなくRDBMSを考えてください。Lookupを使用するのは理にかなっています。
gbn

1
はい、同意します。それを明確にしてくれてありがとう。それでは、リレーショナル整合性とルックアップテーブルを使用した実際の過剰なエンジニアリングはないという、かなり正確な声明でしょうか。つまり、この場合、いくつかのレコードをルックアップテーブルに格納し、それらを消費テーブルで参照すると、前のステートメントは正確になりますか?
トーマスストリンガー

1
@onedaywhen:異なるタイプをデータとして、または決して変化しない静的な値のセットとして見るかどうかに違いがあります。タイプテーブルを使用する場合、データベースとアプリケーションのビジネスルールを変更することなく、テーブルに別のタイプを追加することができます。
グッファ

1
@MichaelKjörling:正しい、それがただのキーだったら。しかし、OPは「v」または「s」のような意味を意図しています。通貨コード(EUR、USD、GBP、CHFなど)のような自己記述型の完全な自然キーについてではありません。
gbn

3

偉大なGBNの答えを補完するように。

たぶんあなたはそのようなものを作成することができます:

create table dbo.VehicleType
(
    VehicleTypeId int not null primary key,
    Name varchar(50) not null,
    Code char(3) null
) 
go 

create table Car
(
    Name varchar(100) not null,
    Description varchar(100) not null,
    VehTypeId int not null ,
    foreign key FKTypeOfCar(VehTypeId) referenctes dbo.VehicleType (VehicleTypeId) 
)
go 

したがって、(外部キーを使用して)リレーショナル整合性を維持しながら、enumを自由に使用できます。このcode列を使用すると、文字コードを自由に使用できるため、データベースに文書化されます(システム統合のためのアプリケーションコードの複雑な変換なしに、DBからコード情報を直接抽出できます)。


nullコードを許可するつもりですか?
ジャックダグラス

ええ、コードはオプションで、まだ体系化されていない車両タイプを表すことができます。
ファブリシオアラウージョ

なぜ人々はコメントを削除したいのですか?かなり迷惑です。
ファブリシオアラウージョ

@FabricioAraujo-コメントが廃止された場合(たとえば、「回答に編集します」と実際に編集する場合)、適用されなくなったコメントをクリーンアップすることをお勧めします。
ニックチャマス

1
タイプテーブルに「未分類」タイプを追加し、外部キーフィールドにnull値を許可するのではなく、VehTypeIdフィールドのデフォルト値を未分類値にすることをお勧めします。一般に、「null」に有効なビジネス上の意味を持たせることは悪い習慣です。
マイケルブラックバーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.