web-dev-qa-db-ja.com

タイプフィールドのINTまたはCHAR

テーブル、Typeまたはchar(1)intフィールドに最適なデザインは何ですか?言い換えれば、このスキーマを考えると:

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

VehTypeintまたはchar(1)にする方が効率的ですか(パフォーマンスに関して)。車のタイプが5つあるとします。0から4までの増分値、またはタイプに文字を使用する必要がありますか(たとえば、「v」、「s」、「c」、「t」、「m」)。

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

_sys.objects_カタログビューでtypeフィールドに文字が使用されていることに気づきました。その理由はありますか?私はここで薄い空気をつかんでいるだけなのでしょうか。

19
Thomas Stringer

通常は1バイトのtinyintも使用します

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

  • 混乱:S:SUVまたは SaloonまたはSedan またはSportsとは何ですか?

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

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

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

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

単一の文字を使用するプラス面...えー、何も見ない

注:関連する 列挙型に関するMySQLの質問 があります。そこでもルックアップテーブルを使用することをお勧めします。

20
gbn

すばらしい補足 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 

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

3
Fabricio Araujo