2

私が設計しているデータベースについて簡単な質問があり、それが正規化されていることを確認しています...

customerIdの主キーを持つcustomerテーブルがあります。顧客のアカウントステータスを反映するコードを持つStatusCode列があります。1 =開いている、2 =閉じている、3=一時停止しているなど。

ここで、顧客テーブルに、アカウントの一時停止が許可されているかどうかを示す別のフィールドが必要です...特定の顧客は、取引条件に違反した場合に自動的に一時停止されます...他の顧客はそうではありません...テーブルフィールドは次のようになります。

顧客(CustomerId(PK):StatusCode:IsSuspensionAllowed)

IsSuspensionAllowedフィールドがYESに設定されている場合を除いて、特定の顧客を知らない限り、ステータスや特定の顧客の一時停止が許可されているかどうかを判断できないため、両方のフィールドは主キーに依存しています。 StatusCode 3(一時停止)。

上記のテーブルデザインから、チェック制約がテーブルに追加されない限り、これが発生する可能性があるようです。IsSuspensionAllowedがYESに設定され、StatusCodeが3に設定されている場合にのみ、2つが相互に依存しているため、これを強制するためにリレーショナル設計に別のテーブルを追加する方法がわかりません。

ですから、私の長い説明の後、私の質問はこれです:これは正規化の問題であり、これを強制するリレーショナル設計は見られません...または実際には、チェック制約と実際、テーブルはまだ正規化されています。

乾杯、

スティーブ

4

1 に答える 1

0

はい、可能です。これは、チェック制約とCaseステートメントを使用して実行できます。

Create Table Customer   (
        CustomerId <datatype> not null Primary Key
        , StatusCode int not null
        , IsSuspensionAllowed int not null Default( 1 )
        , Constraint CK_Customer_IsSuspensionAllowed 
                    Check ( IsSuspensionAllowed In(0,1) )
        , Constraint CK_Customer_StatusCodeRange 
                    Check ( StatusCode Between 0 And ?? )
        , Constraint CK_Customer_StausCodeValid 
                    Check ( Case
                When StatusCode = 3 And IsSuspensionAllowed = 1 Then 0
                                                                Else 1
                                                                End = 1 )
        , ....
        )

PKのデータ型について言及していなかったので、プレースホルダーを挿入しただけです。SQL Serverを使用している場合は、int前述のチェック制約の代わりにビット列を使用できます(bitANSI仕様の一部ではありません)。

これは、ステータスコードなどの代理キーが常にうまく機能するとは限らない場合の良い例です。文字列値でステータスコードを表す方がよいでしょう。その場合、Caseステートメントはを読み取りますWhen StatusCode = 'Suspended' And IsSuspendedAllowed = 0...

正規化の観点からは、何も問題はありません。一時停止が許可されるかどうかは、お客様に固有の属性であり、別の属性ではありません。チェック制約で言っていることは、属性値の特定の状態は存在できないということです。これは問題ありません。

ところで、IsSuspensionAllowed = 0の場合、「一時停止」のステータスは許可されないと言っても意味がありませんか?あなたのデータを使って、許可されていない状態は許されるべきではありませんStatusCode = 3 and IsSuspensionAllowed = 0か?

于 2010-06-13T05:32:02.877 に答える