2011-01-11 7 views
0

列のデータ型の代わりにカスタム値を格納する方法を教えてください。 私は 'Order'という名前のテーブルを持っています。このテーブルでは 'OrderStatus'という名前の列があり、その目的はOrderのStatusを格納することです。たとえば、R =拒否、S = sent、T =返されます。SQL Server 2005にカスタム値を格納する

私は...あなたが本当にカスタムデータ型を必要としない。この場合

答えて

1

データベースや設計に非常に新しいです、あなたはそれであなたのステータスのすべてとテーブルへの外部キーが必要です。

あなたOrderStatus表は次のようになります。

id   int   PK NOT NULL, IDENTITY 
code   char(1)  NOT NULL 
description varchar(100) NOT NULL 

(編集:マーティンは別の答えにコメントで指摘したように、代理idキーが完全に不要ですが、それは簡単のための柔軟性を可能に、注意してください

order_status_id int  FK NOT NULL 
0:あなたの Order表は

)それを参照するデータを更新することなく、codeを変更すると、このテーブルへの外部キーを持っているでしょう

+0

OrdersとOrderStatusの間​​にあなたが言及し、関係を作成したので、この新しいテーブルを作成しました。したがって、注文ステータスを取得したい場合は、文字を正しく返すchar(1)になりますか?値を設定する必要がありますか? –

+0

さらに1つのQ:ユーザーがR = Rejected、S = Sent、T = Returnedの許容値のみを挿入できるように、charデータ型に制限を実装することは可能ですか? –

+0

うん、あなたはこのテーブルに参加し、そのテーブルから 'code'を選択するだけです。入力可能なコードを制限する最も簡単な方法は、単にそのテーブルに対する誰かの書き込み/変更の許可を許可しないことです。 –

0

ベストプラクティスは、最小限のようなスキーマと、そこに承認された値でORDER_STATUSと呼ばれるテーブルを作成する意味し、正規化することである。

ORDER_STATUS(id number auto increment, code character, meaning varchar) 

、次いでORDER_STATUS_IDという列にそのテーブルに注文を関連付けるましたヌルではない外部キーとなります。

+1

文字コードの代わりに代理キーを導入することは、正規化ではありません。 「Orders」テーブルでコードと意味を実際に繰り返すと、正規化の問題になります。 –

1

これは可能です。

OrderStatus OrderStatusCode 
----------- --------------- 
Rejected R 
Sent  S 
Returned T 

その後、あなたのベルトの下にもっと「デザイン」があると、ルックアップテーブルが表示されます。

+1

なぜお待ちですか? –

+0

@ダニエル:私はそうだと思うが、正規化は正しいことをする獣であり、彼よりも時間がかかるかもしれない。また、ジャスミンはいくつかの楽しみを持っている可能性があります... ... –

2

「正しい」答えは、標準SQL-92のCREATE DOMAINを使用することです。残念ながら、SQL Serverはそれをまだサポートしていません。サポートをご希望の場合は、hereに投票できます。

SQL Serverには独自のCREATE TYPEという構文がありますが、最後に見たときに目的に合わないと宣言しました。誰か意見が異なれば、my questionへの回答を投稿してください:)

これは2つの実行可能な選択肢があります:外来キーを持つテーブルまたはCHECKの制約。経験則では、ドメイン値の集合が小さくて安定している場合(例えば、ISO 5218 sex codes)、CHECKの制約を使用します。そうでない場合は、外部キーを持つ表が優先されます。

+0

面白い。 CREATE DOMAINについて知らなかった。 –

関連する問題