3

とりわけ、従業員の名前とその識別文字列を格納したいリレーショナルデータベースがあると想像してみてください。識別文字列の形式は厳密に定義されています。大文字の3つのアルファベット文字、ダッシュ、4桁の数字が続きます。

質問:リレーショナルデータベースでは、特定のテキストフィールドが準拠する必要のある正規表現を定義できますか?私の例のように、UIレベルで行うのではなく、データベースに従業員IDのすべての値を単純な正規表現に対してチェックさせると便利です。

別の質問:このような問題が発生している場合(つまり、追加の制約セットに対してフィールド値を検証する必要がある場合)、スキーマが非正規化されていることを意味し、修正する必要がありますか?

4

3 に答える 3

2

はい、チェック制約を使用してこれを行うことができます。

明らかに、これに対するサポートはベンダーによって異なります。一部のデータベースでは、正規表現のサポートが制限されているか、まったくサポートされていません。一部のデータベースでは、チェック制約がサポートされていません。

于 2012-05-08T20:52:26.210 に答える
0

2番目の質問に関しては、場合によって異なります。(もちろん状況によります。常に状況によります。)従業員 ID 文字列を常に単一の「全体」値として使用すると、正規化されます。常に「1 番目と 2 番目」の部分 (3 文字、4 桁) に分割している場合は、最初の正規形を破っていることになります。(大まかに言えば、1 つの列に 2 つのファクトがあり、それらを独自の列に分割する必要があります。)

適切な正規化を前提として、データが適切な形式であることを確認するためにデータベースに依存しなければならないという事実は、データ ソースの整合性について疑問を投げかけます。データがデータベースに渡されるに、データがチェックされ、クレンジングされ、適切な形式に変換されないのはなぜですか? RDBMS は、データの格納、並べ替え、および取得には非常に優れていますが、複雑なアルゴリズムの処理にはあまり向いていません。それは彼らの目的ではありません。はい、データベースでそれを行うことができますが、それを行うためのより良い方法があります。

于 2012-05-08T21:21:48.413 に答える
0

フィールドの制約を介してチェックを行うことができます。使用しているデータベースによって異なります。SQL Server では、次のような構文を使用する必要がある場合があります。

check (len(EmpId) = 7 and left(EmpId, 3) between 'AAA' and 'ZZZ' and
       substring(EmpId, 4) = '-' and isnumeric(right(EmpId, 4)) = 1 

最初に、「CONSTRAINT ステートメント」の前にチェック制約がテーブル作成に入ります。

第二に、正規表現はこれを行うためのよりクリーンな方法です。ただし、すべてのデータベースがそれらをサポートしているわけではありません。

第三に、上記は完璧ではありません。たとえば、最初の 3 文字に「B1B」を使用できます。より複雑なロジックでそれを修正できます。

最後に、大文字を保証するために、比較の照合で大文字と小文字を区別するように設定する必要がある場合があります。

于 2012-05-08T20:59:21.203 に答える