列のデータ型の代わりにカスタム値を格納する方法を教えてください。 私は 'Order'という名前のテーブルを持っています。このテーブルでは 'OrderStatus'という名前の列があり、その目的はOrderのStatusを格納することです。たとえば、R =拒否、S = sent、T =返されます。SQL Server 2005にカスタム値を格納する
私は...あなたが本当にカスタムデータ型を必要としない。この場合
列のデータ型の代わりにカスタム値を格納する方法を教えてください。 私は 'Order'という名前のテーブルを持っています。このテーブルでは 'OrderStatus'という名前の列があり、その目的はOrderのStatusを格納することです。たとえば、R =拒否、S = sent、T =返されます。SQL Server 2005にカスタム値を格納する
私は...あなたが本当にカスタムデータ型を必要としない。この場合
データベースや設計に非常に新しいです、あなたはそれであなたのステータスのすべてとテーブルへの外部キーが必要です。
あなた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
を変更すると、このテーブルへの外部キーを持っているでしょう
ベストプラクティスは、最小限のようなスキーマと、そこに承認された値でORDER_STATUSと呼ばれるテーブルを作成する意味し、正規化することである。
ORDER_STATUS(id number auto increment, code character, meaning varchar)
、次いでORDER_STATUS_IDという列にそのテーブルに注文を関連付けるましたヌルではない外部キーとなります。
文字コードの代わりに代理キーを導入することは、正規化ではありません。 「Orders」テーブルでコードと意味を実際に繰り返すと、正規化の問題になります。 –
これは可能です。
OrderStatus OrderStatusCode
----------- ---------------
Rejected R
Sent S
Returned T
その後、あなたのベルトの下にもっと「デザイン」があると、ルックアップテーブルが表示されます。
なぜお待ちですか? –
@ダニエル:私はそうだと思うが、正規化は正しいことをする獣であり、彼よりも時間がかかるかもしれない。また、ジャスミンはいくつかの楽しみを持っている可能性があります... ... –
「正しい」答えは、標準SQL-92のCREATE DOMAIN
を使用することです。残念ながら、SQL Serverはそれをまだサポートしていません。サポートをご希望の場合は、hereに投票できます。
SQL Serverには独自のCREATE TYPE
という構文がありますが、最後に見たときに目的に合わないと宣言しました。誰か意見が異なれば、my questionへの回答を投稿してください:)
これは2つの実行可能な選択肢があります:外来キーを持つテーブルまたはCHECK
の制約。経験則では、ドメイン値の集合が小さくて安定している場合(例えば、ISO 5218 sex codes)、CHECK
の制約を使用します。そうでない場合は、外部キーを持つ表が優先されます。
面白い。 CREATE DOMAINについて知らなかった。 –
OrdersとOrderStatusの間にあなたが言及し、関係を作成したので、この新しいテーブルを作成しました。したがって、注文ステータスを取得したい場合は、文字を正しく返すchar(1)になりますか?値を設定する必要がありますか? –
さらに1つのQ:ユーザーがR = Rejected、S = Sent、T = Returnedの許容値のみを挿入できるように、charデータ型に制限を実装することは可能ですか? –
うん、あなたはこのテーブルに参加し、そのテーブルから 'code'を選択するだけです。入力可能なコードを制限する最も簡単な方法は、単にそのテーブルに対する誰かの書き込み/変更の許可を許可しないことです。 –