1

我正在尝试基于从非数据库系统导入的平面文件创建一个小型数据库。导入工作正常,数据库很好,但我添加了一个新表,其中包含来自另一个系统的数据。我正在尝试在表之间创建关系,但是因为一个表具有重复的行(平面文件是源),所以我无法设置该关系。示例:表 1 列出了医生为患者完成的所有程序。患者可以在同一天由同一位医生进行许多相同的程序(因此重复的行)...表 2 列出了医生和他们的 ID #s ...我想根据医生的姓名在两个表之间建立关系,但由于数据不唯一,我遇到了错误。有人有小费吗?谢谢

4

2 回答 2

0

患者可以在同一天由同一位医生进行许多相同的程序(因此重复的行)

通常,即使存在重复行,您也应该能够设置从 Table1 到 Table2 的外键关系。这种错误通常意味着您试图在错误的表中设置外键。

-- 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');
于 2012-11-15T17:53:57.980 回答
0

根据您的描述,我不确定重复数据问题在哪里。你有:

  • 表 1:程序。同一位医生可能有很多行
  • 表 2:医生。每个医生应该是 1 行(但可能有重复)

有意义的关系是 1[表 2 医生行] -> 许多[表 1 程序行]。即表 2 将是关系中的主键表:每个表 2 行与 0 和“许多”表 1 行之间相关。如果您尝试创建这种关系,那么多个重复的 table 1 行不是问题。

但是,如果表 2 中每个医生有多个行,那么您将无法创建这种关系,因为表 2 行不是唯一的,因此不能充当关系中的主键元素。那么问题是数据清理之一:找出表 2 中的哪些行是重复的,更新表 1 的行以指向重复中的一位医生,然后从表 2 中删除重复的行。

您提到了医生 ID#s 和医生姓名。医生姓名对于唯一键来说是一个不好的选择;如果用户尝试添加一个名为“John Smith”的新医生,而该名称已经有另一位医生,则

  1. 您在 PhysicianName 上设置了唯一索引,他们的更改被拒绝,并且您有一个愤怒的用户;或者
  2. 您还没有,所有现有医生(我们称他为 John A. Smith)的程序都将与另一位医生(我们称他为 John B. Smith)相关联,反之亦然。

应使用医师 ID 建立关系。如果表 1(程序)包含医师 ID 列,那么您很幸运。如果它只包括医生姓名,那么如果表 2 中已经有重复的医生姓名,那么您可能会遇到数据清理问题。

于 2012-11-15T18:34:41.313 回答