【问题标题】:Simple attendance list SQL schema architecture advice简单考勤表 SQL schema 架构建议
【发布时间】:2019-12-11 07:57:24
【问题描述】:

我有一份纸质体育俱乐部名单,我必须把它带到网上。 基本上,除了 SQL 架构体系结构外,我已经掌握了一切。

我从未设计过数据库,我不确定它是否是正确的方法。感谢您的帮助!

如果这个人在场,我们用笔在纸上画一个 x :) 要做看起来像在纸上一样,但在一个应用程序中,我尝试使用 Spring Data JPA-Hibernate 开发一个 Java Vaadin 应用程序。

纸上和未来的APP是这样的:

这是 MySQL 架构:

create table person(
id int PRIMARY KEY AUTO_INCREMENT,
first_name varchar(20)
);

create table isPresent(
id int PRIMARY KEY AUTO_INCREMENT,
isPresent boolean
);

create table persons_isPresent(
person_id int,
isPresent_id int,
FOREIGN KEY (person_id)
REFERENCES person(id),
FOREIGN KEY (isPresent_id)
REFERENCES isPresent(id)
);

create table training(
id int PRIMARY KEY AUTO_INCREMENT,
person_id int,
isPresent_id int,
training_time datetime,
FOREIGN KEY (person_id)
REFERENCES person(id),
FOREIGN KEY (isPresent_id)
REFERENCES isPresent(id)
);

我从未设计过数据库,我不确定它是否是正确的方法。感谢您的帮助!

【问题讨论】:

  • 标题含糊。重写以总结您的具体问题。
  • 这还不清楚。你是什​​么意思,“SQL 模式架构”?你究竟是如何被困在试图生产什么的? PS 是时候阅读已出版的关于信息建模、关系模型和数据库设计的学术教科书了。 (记录和使用设计的语言和工具手册不是这样的教科书。)(维基文章或网络帖子也不是。)现在你只是要求我们重写一个。那太宽泛了。关注一个并提出一个问题。请use text, not images/links, for text--including tables & ERDs.
  • 您在哪里看到图像中的代码?上表来自纸质

标签: mysql sql postgresql jpa database-design


【解决方案1】:

ispresent ID 似乎没有必要。

我会保持您的Person 表不变。

创建一个带有 ID 和时间的 Training 表,以及一个带有培训 ID 和人员 ID 的 TrainingAttendance 表。如果您想查看某人参加培训的情况,请检查 TrainingAttendance 中是否存在包含人员 ID 和培训 ID 的记录。


CREATE TABLE PERSON (
    PERSON_ID INTEGER NOT NULL PRIMARY KEY,
    FIRST_NAME VARCHAR(20) NOT NULL);

CREATE TABLE TRAINING (
    TRAINING_ID INTEGER NOT NULL PRIMARY KEY
    TRAINING_TIME DATETIME NOT NULL);

CREATE TABLE TRAINING_ATTENDANCE (
    TRAINING_ID INTEGER NOT NULL,
    PERSON_ID INTEGER NOT NULL,
    FOREIGN KEY(PERSON_ID) REFERENCES PERSON(PERSON_ID),
    FOREIGN KEY(TRAINING_ID) REFERENCES TRAINING(TRAINING_ID),
    PRIMARY KEY(TRAINING_ID, PERSON_ID));



【讨论】:

  • 谢谢@Michael Bianconi,看来你是对的!
【解决方案2】:

我认为独立考虑培训课程可能更简洁。然后你可以通过三个表 [training][person] 来实现,其中的参加者是一个绑定表。所以可能是这样的:

create table training(
id int PRIMARY KEY AUTO_INCREMENT,
training_time datetime
);

create table person(
id int PRIMARY KEY AUTO_INCREMENT,
first_name varchar(20)
);

create table attendee(
id int PRIMARY KEY AUTO_INCREMENT,
person_id int,
training_id int,
FOREIGN KEY (person_id) REFERENCES person(id),
FOREIGN KEY (training_id) REFERENCES training(id)
);

我尝试了一些简单的插入/选择,它可能对你有用吗?


insert INTO person (first_name) VALUES ('Pavel');
insert INTO training (training_time) VALUES (NOW());
insert INTO attendee (person_id, training_id) VALUES (1,1);

select person.first_name, training.training_time
from attendee, person, training 
where person.id = attendee.person_id 
AND training.id = attendee.training_id;

【讨论】:

    猜你喜欢
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多