SQL DBMS:案例研究:我应该有多少个实体表?我应该为每个角色创建单独的表吗?

问题描述 投票:0回答:1

我是否应该为宠物看护跟踪服务中的角色创建三个单独的表?角色被描述为处理程序。保姆和客户。我刚刚在 SQL 中创建了一个 User 表,并将其中一个属性设置为角色,然后只放置其中一个角色。但是,如果我为角色创建三个单独的表并仅重复电话号码、地址等,会更好吗?我将角色放在用户中的唯一原因是因为我认为不断重复问题是多余的。创建的数据库称为 PSIRT。

案例研究如下:

“宠物保姆响应跟踪系统 (PSIRT) 是一个记录为狗和猫提供的服务的系统。

当请求宠物保姆服务时,系统会为其分配一个唯一标识符并存储在数据库中。对于每项服务,系统都会跟踪订单号、订单类型(从可能动态更改的列表中选择)、创建日期、服务状态(可以是“待处理”、“已分配”或'已完成'),以及自由格式评论列表。每条评论都与撰写该评论的回复者的姓名相关联。

此外,每个订单可以是任意数量的人员(姓氏、名字、角色、电话、电子邮件地址)和 IP 地址。

宠物保姆服务响应者可以通过订单号轻松查询数据库,并获得给定服务的整个历史记录的详细报告。

PSIRT 系统具有三种类型的响应者:客户端、保姆和处理程序。客户创建和管理请求,他们还可以向服务添加评论。处理人员向客户推荐宠物保姆,客户可以接受或拒绝服务请求。服务被接受后,订单状态将更新为“已分配”,并且保姆可以访问客户的联系信息以添加服务报告。服务完成后,保姆更新订单状态,客户再次确认。然后订单状态更改为“已完成”,并且订单已存档。

自由格式评论必须按从顶部最新帖子到底部最旧帖子的顺序排序。

宠物保姆服务日志的所有更新都会记录为订单上的自由格式评论。而且,值得注意的是,所有系统使用都需要通过外部单点登录系统进行身份验证。”

我创建的 SQL:

--创建数据库 创建数据库 PSIRT;

--使用数据库 PSIRT 使用 PSIRT;

--餐桌顺序 创建表订单( 订单号 INT(20) NOT NULL, 订单类型 VARCHAR(255) NOT NULL, 创建日期日期不为空, 服务状态 VARCHAR(50) NOT NULL, CommentID INT(20) NOT NULL, CONSTRAINT ORDER_PK 主键(订单编号), CONSTRAINT ORDER_FK FOREIGN KEY(CommentID) 参考评论(CommentID) );

--表用户 --客户、保姆和处理人员 创建表用户( 用户 ID INT(20) NOT NULL, 姓氏 VARCHAR(80) NOT NULL, 名字 VARCHAR(80) NOT NULL, 角色 VARCHAR(50) NOT NULL, 电话 VARCHAR(12) NOT NULL, 电子邮件地址 VARCHAR(100) NOT NULL, 订单号 INT(20) NOT NULL, IP 地址 VARCHAR(15) NOT NULL, 约束 USER_PK 主键(用户 ID), CONSTRAINT USER_FK FOREIGN KEY(OrderNumber) REFERENCES ORDER(OrderNumber) );

--表评论 创建表注释( CommentID INT(20) NOT NULL, 评论日期日期不为空, 注释文本 VARCHAR(255) NULL 用户 ID INT(20) NOT NULL, 订单号 INT(20) NOT NULL, CONSTRAINT COMMENT_PK 主键(评论ID), CONSTRAINT COMMENT_FK 外键(用户 ID)引用用户(用户 ID), CONSTRAINT COMMENT_FK_ORDER FOREIGN KEY(OrderNumber) REFERENCES ORDER(OrderNumber) );

sql rdbms
1个回答
0
投票

在我看来,,您不应该为每个角色创建单独的表。

目前有3个角色。想象一下,您创建的整个应用程序基于每个角色使用一个表的数据模型。一切顺利,应用程序正常运行,数据正在插入,报告已打印......酷。

然后,客户说应该添加一个新角色。你会怎么做?创建另一个表,修改您迄今为止编写的所有查询,修改所有报告,一切。假设您这样做(并花费大量时间和精力......更不用说这样做的实际成本)。

然后,下个月,另一个角色出现。你会再这样做吗?你可以,但你当然不应该。

如果将所有内容保留在一个表中,则添加新角色很容易 - 只需插入表即可。所有查询都有效,所有报告都有效...您无需执行任何操作


不过,请考虑创建一个单独的 ROLE 表,然后通过外键约束从 USER 引用该表,例如

create table role (role_id int(20) constraint pk_role primary key, name varchar(20) ); create table user (user_id int(20) constraint pk_user primary key, ... role_id int(20) constraint fk_user_role references role (role_id) );
    
© www.soinside.com 2019 - 2024. All rights reserved.