sql >> データベース >  >> RDS >> Sqlserver

SQL Server での 1:1 および 1:m の関係の設計

    どの関係でも、「親」テーブル (一方の側) には各行を一意に識別するプライマリ (または一意の) キー (PK) があり、「子」テーブル (反対側) には外部キー列が必要です。 、親テーブルの主キーの既存の値と同じ値を入力する必要があります。 1 対多 (1-M) の関係が必要な場合、外部キーは、繰り返し可能な子テーブルの通常の属性 (1 つまたは複数の列) である必要があります (同じ値を持つ行が多数存在する可能性があります)

    1 対 1 (1-1) の関係が必要な場合は、外部キー自体が子テーブルの主キーまたは一意のインデックスである必要があります。これにより、子テーブルにその値を持つ行が最大で 1 つ存在する可能性が保証されます。

    1 対 1 の関係は、テーブル内の属性 (列) を効果的に 2 つのテーブルに分割します。これを垂直セグメンテーションと呼びます。これは、サブクラス化のためによく行われます または、別の理由で、テーブル内の列の使用パターンが、いくつかの列が残りの列よりも大幅に頻繁にアクセスする必要があることを示している場合。 (たとえば、1 つまたは 2 つの列が 1 秒あたり数千回アクセスされ、残りの 40 列は月に 1 回だけアクセスされるとします)。実際にこの方法でテーブルを分割すると、これら 2 つの異なるクエリのストレージ パターンが最適化されます。

    サブクラス .上記は、実際には 1 対 0 または 1 の関係を作成します。これは、サブクラスまたはサブタイプの関係と呼ばれるものに使用されます。これは、多数の属性を共有する 2 つの異なるエンティティがあり、一方のエンティティにもう一方が必要としない追加の属性がある場合に発生します。良い例は Employees かもしれません 、および SalariedEmployees . 従業員 テーブルには、すべての従業員が共有するすべての属性があり、SalariedEmployee テーブルは、従業員と (1-0/1) の関係で存在し、追加の属性 (Salary年次休暇 など)サラリーマンだけが必要とするものです。

    本当に 1 対 1 の関係が必要な場合は、別のメカニズムを追加して、子テーブルが親テーブルの各レコード/行に対して常に 1 つのレコードを持つことを保証する必要があります。通常、これを行う唯一の方法は、データの挿入に使用されるコード (トリガー、ストアド プロシージャ、またはデータベース外のコード) でこれを強制することです。これは、行が常に両方に存在する必要がある 2 つのテーブルに参照整合性制約を追加した場合、一方の制約に違反せずにいずれか一方に行を追加することはできず、両方に行を追加することもできないためです。同時にテーブル。



    1. Grails2.0.1でのOracle10gCLOBの使用

    2. ExcelデータをMySQLデータベースにインポートする方法を学ぶ

    3. MYSQL FULLTEXT検索は、ハイフン'-'およびプラス'+'では機能しません

    4. MySQLデータベースは8時間後に接続を切断します。それを防ぐ方法は?