2012-05-08 12 views
3

私は、とりわけ従業員の名前とその識別文字列を格納するリレーショナルデータベースを持っているとしましょう。識別文字列の形式は厳密に定義されています。大文字3文字、ダッシュ、4桁の数字が続きます。SQLスキーマの一部としての正規表現

質問:リレーショナルデータベースでは、特定のテキストフィールドが準拠しなければならない正規表現を定義できますか?私の例のように、データベースをUIレベルで行うのではなく、シンプルな正規表現に対して、従業員IDのすべての値をチェックするようにするのは良いことです。

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

答えて

0

あなたの2番目の質問に関しては、それは異なります。 (もちろんそれは依存していますが、常に依存します。)従業員識別文字列を常に単一の「全体」値として使用すると、正規化されます。あなたが「最初と2番目」の部分(3桁、4桁)に常に壊れていることがわかったら、最初の正規形を破っています。 (大雑把に言えば、ある列に2つの事実があり、それをそれぞれの列に分割する必要があります。)

適切な正規化を仮定すると、データが正しい形式であることを保証するためにデータベースに依存しなければならないという事実データソースの整合性について疑問を投げかけます。のデータがデータベースに渡される前に、データがチェックされ、クレンジングされ、適切な形で入れられないのはなぜですか?? RDBMSはデータの格納、ソート、および検索には本当に優れていますが、複雑なアルゴリズムの処理にはあまり熱心ではありません。それは彼らのためだけではありません。あなたはデータベースでそれを行うことができます、はい、それを行うより良い方法があります。

2

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

これは、ベンダーとの間で変化するために明らかにサポートしています。一部のデータベースでは、正規表現のサポートが限られているか、サポートされていないものがあります。

0

フィールド上の制約を使用してチェックを行うことができます。使用しているデータベースによって異なります。 。チェック制約は、「CONSTRAINT文によって先行テーブルの作成に入り、

第二に、正規表現がきれいになり

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

まず:SQL Serverでは、次のような構文を使用する必要がある場合がありますこれを行う方法。しかし、すべてのデータベースがそれらをサポートしていません。

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

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