我们可以将主键添加到损坏的表中

时间:2015-10-14 16:38:34

标签: sql-server many-to-many primary-key

我有这些表格:

Emp_Tutor: Tutor table.
Emp_Tu_De :Tutor details table.
Emp_Tu_St: Tutor status table.
Emp_School: School table.

我们知道学校有很多导师,每个导师可能在一所学校或另一所学校工作,也许有两三所学校。 所以导师表我把它作为学校和导师详细信息之间的破损表格>

导师状态表我们创建它以插入导师教学状态(课程,课程,教学时间,课程等)。

所以我的问题:
我可以在Tutor表中添加主键以建立(Tutor表和Tutor状态表)之间的关系吗? 不要忘记导师桌是一种破碎的关系 look at image attachment.

1 个答案:

答案 0 :(得分:0)

我发现尝试存储 status 等内容通常是个错误。例如,就业"状态" of" current","前"," rehire"通常更好地实施为具有开始日期和结束日期的就业表。

损坏的表格断开的关系在数据库设计中不是正常的英语术语。我不确定你的意思。

PostgreSQL代码如下。 SQL Server将使用datetime数据类型代替标准SQL的时间戳数据类型。可能还有其他一些小差异。

-- Nothing surprising here.
create table schools (
  school_id integer primary key,
  school_name varchar(20) not null unique
  -- other columns go here
);

-- Nothing surprising here.
create table tutors (
  tutor_id integer primary key,
  tutor_name varchar(20) not null
  -- other columns go here
);

-- Nothing surprising here.
create table tutor_details (
  tutor_id integer primary key references tutors (tutor_id),
  tutor_phone varchar(15) 
  -- other columns go here
);

-- Predicate: School <school_id> employed <tutor_id> 
-- starting on <start_date> and ending on <end_date>.
-- Allows multiple periods of employment.
create table school_tutors (
  school_id integer not null references schools (school_id),
  tutor_id integer not null references tutors (tutor_id),
  start_date date not null default current_date,
  end_date date not null default '9999-12-31',
  -- You can make a good, practical argument for including end_date
  -- in the primary key, but that's a different issue.
  primary key (school_id, tutor_id, start_date)
);


-- Only makes sense in the context of employment, so a composite
-- foreign key references school_tutors. In production, I'd try
-- to use more check constraints on the timestamps.
create table tutor_office_hours (
  school_id integer not null,
  tutor_id integer not null,
  start_date date not null,
  foreign key (school_id, tutor_id, start_date) 
    references school_tutors (school_id, tutor_id, start_date),
  office_hours_start_time timestamp not null,
  office_hours_end_time timestamp not null
    check (office_hours_end_time > office_hours_start_time),
  primary key (school_id, tutor_id, office_hours_start_time)
);