2012-01-05 12 views
2

Q: "標準SQL"で自己文書化列挙を実装する方法はありますか?私はいつも何をやったかSQLベースのアプリケーションで「コード」を自己文書化する最良の方法は何ですか?

EXAMPLE: 
    Column: PlayMode 
    Legal values: 0=Quiet, 1=League Practice, 2=League Play, 3=Open Play, 4=Cross Play 

単に「CHAR(1)」または「INT」としてフィールドを定義し、コード内のコメントとしてニーモニック(「リーグの練習を」)を定義しています。

これ以上の提案はありますか?

私は間違いなく標準SQLを使用してデータベースタイプ(mySql、MSSQL、Oracleなど)を使用することをお勧めします。私はまた、任意のアプリケーション言語(C、C#、Javaなど)を使用することを好むので、プログラミング言語も重要ではありません。

ありがとうございました!

PS: 2番目のテーブルを使用すると、コードを説明にマップすることがわかりました。たとえば、「テーブルplaymodes(char(1)id、varchar(10)名)」は非常に高価です。これは必ず正しいですか?

+1

データベースのenums - 賛否両論:http://stackoverflow.com/questions/336846/database-enums-pros-and-cons –

答えて

4

(その目的は、列変数のドメインを制限することがあるので。)通常の方法は、静的なルックアップテーブルを使用することで、時には「ドメインテーブル」と呼ばれる

これは、基礎となる値を保持するのはあなた次第ですデータベース内の値と同期して(ドメインテーブル内の何かが変更されたときに呼び出されるドメインテーブルから列挙を生成するコードジェネレータを書くかもしれません)

-- 
-- the domain table 
-- 
create table dbo.play_mode 
(
    id   int   not null primary key clustered , 
    description varchar(32) not null unique nonclustered , 
) 

insert dbo.play_mode values (0 , "Quiet"   ) 
insert dbo.play_mode values (1 , "LeaguePractice") 
insert dbo.play_mode values (2 , "LeaguePlay" ) 
insert dbo.play_mode values (3 , "OpenPlay"  ) 
insert dbo.play_mode values (4 , "CrossPlay"  ) 

-- 
-- A table referencing the domain table. The column playmode_id is constrained to 
-- on of the values contained in the domain table playmode. 
-- 
create table dbo.game 
(
    id   int not null primary key clustered , 
    team1_id int not null foreign key references dbo.team(  id) , 
    team2_id int not null foreign key references dbo.team(  id) , 
    playmode_id int not null foreign key references dbo.play_mode(id) , 
) 
go 

「経済」の理由から、そのようなコードすべてに対して単一のキャッチオールテーブルを使用することを提案する人もいるかもしれませんが、私の経験上、最終的には混乱の原因となります。ベストプラクティスは、離散値のセットごとに1つの小さなテーブルです。

+0

"ドメインテーブル"がおそらく*非効率的ではないように思えますが、そして確かに*それは正しい方法です*。私に正しい言葉を教えるための+1 - "ドメインテーブル"。ありがとうございました:) – paulsm4

2

「コード」テーブルに外部キーを追加します。

コード表には、コード値であるPKがあり、値の説明に入力する文字列説明列を追加します。私はvery expensiveであるとしてこれを見ることができない

table: PlayModes 

Columns: PlayMode  number --primary key 
     Description string 

、データベースはこのようなテーブルを結合に基づいています。

1

この情報は、コメントではなくデータベースのどこかにあるべきです。

だから、あなたはそのコードを含むテーブルを持っていて、それにあなたのテーブルにFKを広げるべきです。

1

私は@Nicholas Carey(+1)に同意します:コードを使用するすべてのテーブルで外部キー制約を持つ、 "Key"または "ID"と "Description"という2つの列を持つ静的データテーブル。多くの場合、ID列は単純なサロゲートキー(1,2,3など)になりますが、合理的な場合はさらに進んで「特別な」コードを使用します。以下はいくつかの例です。

値がシーケンス(たとえば、Ordered、Paid、Processed、Shipped)の場合は、1,2,3,4を使用してシーケンスを示すことがあります。これにより、まだ発送されていないすべての注文(ID < 4)など、すべての段階を「上に」突き止めたい場合には、作業が簡単になります。先に計画している場合は、10,20,30,40とします。これにより、新しいコードやステータスが来たときに、既存の値の間に値を追加することができます。 (はい、あなたは何かを予期することはできませんし、何かを予期してはいけないかもしれませんが、このような事前計画のビットは少し簡単に変更することができます)

キー/整数(1バイト、2バイト、4バイト、何でも)。キャラクターの価値を作るためのコストはわずかです(1文字、2文字、3文字、4文字)。それは文字で、ではなく、です。 、この方法は、あなたがあなたのコードにニーモニックを持つことができます完了など

  • O、P、R、S
  • あるいは、パラジウム、PR、Shの
  • Ordr、有料、PROC、船
として

...または何でもあなたのボートを浮かべます。このようにして、解析やデバッグの際に多くの時間を節約できることが分かりました。ルックアップ・テーブル、リレーショナル・インテグリティのためのルックアップ・テーブル、およびより曖昧なコードのリマインダが必要です。

+0

"ドメインテーブル" + "ニーモニックコード"の考え方+1。ありがとうございました! – paulsm4

関連する問題