非データベースシステムからインポートしたフラットファイルに基づいて小さなDBを作成しようとしています。インポートは機能しており、DBは正常ですが、別のシステムからのデータを含む新しいテーブルを追加しました。テーブル間に関係を作成しようとしていますが、1つのテーブルに重複する行があるため(フラットファイルがソースです)、その関係を設定できません。例:表1に、医師が患者に対して行ったすべての手順を示します。患者は、同じ日に同じ医師によって同じ手順の多くを実行できます(したがって、行が重複しています)...表2には、医師と彼らのID番号...医師の名前に基づいて2つのテーブル間の関係を設定したいのですが、データが一意でないためにエラーが発生します。誰かがヒントを持っていますか?ありがとう
2 に答える
the patient can have many of the same procedures on the same day by the same physician (hence the duplicate rows)
Normally, you should be able to set a foreign key relationship from Table1 to Table2 even in the presence of duplicate rows. This kind of error usually means you're trying to set the foreign key in the wrong table.
-- Your "Table2"
create table physicians (
physician_id integer primary key,
physician_name varchar(35) not null -- names are not unique
);
insert into physicians values
(1, 'Doctor Who'), (2, 'Dr. Watson');
create table patients (
patient_id integer primary key,
patient_name varchar(35) not null -- names are not unique
);
insert into patients values
(100, 'Melville, Herman'), (101, 'Poe, Edgar Allen');
-- Your "Table1"
-- Allows multiple physicians per date.
create table patient_procedures(
patient_id integer not null references patients (patient_id),
physician_id integer not null references physicians(physician_id),
procedure_date date not null default current_date,
procedure_name varchar(15) not null,
primary key (patient_id, physician_id, procedure_date, procedure_name)
);
insert into patient_procedures values
(100, 1, '2012-01-02', 'CBC'),
(100, 1, '2012-01-02', 'Thyroid panel');
あなたの説明から、重複データの問題がどこにあるのかわかりません。あなたが持っている:
- 表 1: 手順。同じ医師の行がたくさんある可能性があります
- 表 2: 医師。医師ごとに 1 行にする必要があります (ただし、重複する可能性があります)。
意味のある関係は、1[表 2 の医師の行] -> 多くの [表 1 の手順の行] です。つまり、テーブル 2 はリレーションシップの主キー テーブルになります。テーブル 2 の各行は、テーブル 1 の 0 から「多数」の行に関連しています。この種のリレーションシップを作成しようとする場合、複数のテーブル 1 行の重複は問題になりません。
ただし、テーブル 2 に医師ごとに複数の行がある場合、この種の関係を作成することはできません。これは、テーブル 2 の行が一意ではないため、関係の主キー要素として機能できないためです。問題は、データクレンジングの 1 つです。テーブル 2 のどの行が重複しているかを特定し、テーブル 1 の行を更新して、重複する医師のうちの 1 人だけを指すようにし、次にテーブル 2 から重複する行を削除します。
あなたは医師の ID 番号と医師の名前に言及しています。一意のキーとして医師名を選択するのは適切ではありません。ユーザーが「John Smith」という名前の新しい医師を追加しようとした場合、その名前の別の医師が既に存在します。
- PhysicianName に一意のインデックスを設定しましたが、その変更は拒否され、怒っているユーザーがいます。また
- そうではなく、既存の医師 (彼を John A. Smith と呼びましょう) のすべての手順が他の医師 (彼を John B. Smith と呼びましょう) に関連付けられ、その逆も同様です。
関係は、医師 ID を使用して設定する必要があります。表 1 (手順) に医師 ID 列が含まれている場合は、幸運です。医師の名前のみが含まれている場合、表 2 に既に重複した医師の名前がある場合、データ クレンジングの問題が発生している可能性があります。