我应该有多少个实体表?用户表属性角色还是角色的三个表?

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

宠物看护跟踪服务中的角色被描述为处理者、保姆和客户。

我应该有多少个实体表?

我在 SQL 中创建了一个 User 表,并将其中一个属性设为角色并记录其中一个角色。

也许我应该为角色创建三个表,然后重复电话号码、地址等。

我将角色放在用户中,因为不断重复问题是多余的。

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

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

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

宠物保姆服务响应者可以通过以下方式轻松查询数据库: 订单号并获取整个历史记录的详细报告 提供服务。

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

自由格式评论必须按从最新帖子到最上面的顺序排序 最古老的在底部。

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

我创建的 SQL:

CREATE DATABASE PSIRT;

USE PSIRT;

CREATE TABLE ORDER(
    OrderNumber INT(20) NOT NULL,
    TypeOfOrder VARCHAR(255) NOT NULL,
    DateCreated DATE NOT NULL,
    ServiceState VARCHAR(50) NOT NULL,
    CommentID INT(20) NOT NULL,
    CONSTRAINT ORDER_PK PRIMARY KEY(OrderNumber),
    CONSTRAINT ORDER_FK FOREIGN KEY(CommentID) REFERENCES COMMENT(CommentID)
    );

CREATE TABLE USER(
    UserID INT(20) NOT NULL,
    LastName VARCHAR(80) NOT NULL,
    FirstName VARCHAR(80) NOT NULL,
    Role VARCHAR(50) NOT NULL,
    Phone VARCHAR(12) NOT NULL,
    EmailAddress VARCHAR(100) NOT NULL,
    OrderNumber INT(20) NOT NULL,
    IPAddress VARCHAR(15) NOT NULL,
    CONSTRAINT USER_PK PRIMARY KEY(UserID),
    CONSTRAINT USER_FK FOREIGN KEY(OrderNumber) REFERENCES ORDER(OrderNumber)
);

CREATE TABLE COMMENT(
    CommentID INT(20) NOT NULL,
    CommentDate DATE NOT NULL,
    CommentText VARCHAR(255) NULL
    UserID INT(20) NOT NULL,
    OrderNumber INT(20) NOT NULL,
    CONSTRAINT COMMENT_PK PRIMARY KEY(CommentID),
    CONSTRAINT COMMENT_FK FOREIGN KEY(UserID) REFERENCES USER(UserID),
    CONSTRAINT COMMENT_FK_ORDER FOREIGN KEY(OrderNumber) REFERENCES ORDER(OrderNumber)
);

sql rdbms
1个回答
2
投票

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

目前有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.