gpt4 book ai didi

database-design - "Extend"关系数据库中的关系

转载 作者:行者123 更新时间:2023-12-04 06:31:37 26 4
gpt4 key购买 nike

您好,
我目前正在尝试应用最有效的方法来存储关系数据库中实体之间的“扩展”关系。

举例来说,假设我们有以下简化的实体:

  • User
  • Student (扩展 User)
  • Teacher (扩展 User)
  • User包含同时适用于 Student 的属性和 Teacher .两者 StudentTeacher包含它们独有的自定义属性。

    首先想到的是创建一个包含所有单一数据列的表(即,除了一对多字段):
    User
    -------------
    User ID
    First name
    Last name
    Student class
    Teacher office no.
    Teacher description
    ...

    然而,从存储的角度来看,这不会非常有效,因为:
  • 大多数行将包含学生,少量教师
  • 教师将有更多独特的列,这会浪费学生行中的空间

  • 复制实体之间的关系会更有效:
    User
    -------------
    User ID
    First name
    Last name
    ...


    Student
    -------------
    User ID
    Student class
    ...


    Teacher
    -------------
    User ID
    Teacher office no.
    Teacher description
    ...

    所以我的问题是:
  • 上述问题是否太过分了,即我们应该将存储效率留给数据库引擎吗?
  • 就规范化而言,将实体拆分为 3 个表仍然可以吗?
  • 如果这不是一个好方法,您建议如何处理关系数据库中的“扩展”关系?

  • 谢谢你。

    最佳答案

    如果用户不能既是老师又是学生,那么您正在查看一个简单的父类(super class)型/子类型问题。 (我在关系数据库设计意义上使用父类(super class)型和子类型,而不是在面向对象编程意义上使用。)您应该只在“学生”中存储描述学生的那些属性,并仅存储在“教师”中那些描述教师的属性。

    -- Supertype: users
    create table users (
    user_id integer not null unique,
    user_type char(1) not null
    check (user_type in ('T', 'S')),
    -- other user columns
    primary key (user_id, user_type)
    );

    -- Subtype: students
    create table students_st (
    user_id integer not null,
    user_type char(1) not null default 'S'
    check (user_type = 'S'),
    locker_num integer not null unique
    check (locker_num > 0),
    -- other student columns
    primary key (user_id, user_type),
    foreign key (user_id, user_type)
    references users (user_id, user_type)
    on delete cascade
    );

    -- Subtype: teachers
    create table teachers_st (
    user_id integer not null,
    user_type char(1) not null default 'T'
    check (user_type = 'T'),
    office_num char(4),
    -- other teacher columns
    primary key (user_id, user_type),
    foreign key (user_id, user_type)
    references users (user_id, user_type)
    on delete cascade
    );

    create view teachers as
    select u.user_id,
    u.user_type,
    -- other user columns
    t.office_num
    -- other teacher columns
    from users u
    inner join teachers_st t on (u.user_id = t.user_id);

    create view students as
    select u.user_id,
    u.user_type,
    -- other user columns
    s.locker_num
    -- other student columns
    from users u
    inner join students_st s on (u.user_id = s.user_id);

    此时,您还可以执行 dbms 所需的任何操作来使这两个 View 可更新 — 触发器、规则等等。应用程序代码从 View 中插入、更新和删除,而不是从基表中插入、更新和删除。

    关于database-design - "Extend"关系数据库中的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5347889/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com