テーブル、Type
またはchar(1)
のint
フィールドに最適なデザインは何ですか?言い換えれば、このスキーマを考えると:
_create table Car
(
Name varchar(100) not null,
Description varchar(100) not null,
VehType .... not null
)
_
VehType
をint
またはchar(1)
にする方が効率的ですか(パフォーマンスに関して)。車のタイプが5つあるとします。0から4までの増分値、またはタイプに文字を使用する必要がありますか(たとえば、「v」、「s」、「c」、「t」、「m」)。
それ以上の場合は、別のTypeテーブルを使用して外部キーの関係を作成しますが、その必要性はありません。
_sys.objects
_カタログビューでtype
フィールドに文字が使用されていることに気づきました。その理由はありますか?私はここで薄い空気をつかんでいるだけなのでしょうか。
通常は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の質問 があります。そこでもルックアップテーブルを使用することをお勧めします。
すばらしい補足 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からコード情報を直接抽出できます)。 。