求一个数据库表的设计思路

时间:2022-12-11 18:36:03
让小弟做一个公司领导的日程安排,可以上下周的翻动
一共5位领导,每天均分成上下午,每天每位领导的上午和下午都可以有多条事件,也可以没有一条记录,但仍然要把所有领导都列出来,形成一个表格
横向是星期一到日,纵向第一列是领导的名字,第二列是上下午这样一个表格
如何设计这样一个表结构呢,郁闷了半天有点想不出来怎么才能快速显示出这样一个页面

9 个解决方案

#1


给你个最简单的做法:
表结构仅单纯的记录下最小事件单位的信息即可
如:
1.事件详情表
工号,事件发生时间,事件内容
2.员工表
工号,姓名
然后抽出的sql思路是,将周1-7每天的事件详情做成子查询1,将员工表数据按照能抽出这5位领导的条件做成子查询2,再把这两个子查询关联起来即可
大概是这样的
select 
T.员工号,
WEEK1.事件内容,
......
WEEK7.事件内容
from (抽出5位领导from员工表where 工号 in (5位领导工号)) T1 LEFT JOIN
       (抽出周1数据From事件详情表WHERE 事件发生日期=周1) AS WEEK1 LEFT JOIN
        (抽出周2数据From事件详情表WHERE 事件发生日期=周2)AS WEEK2 LEFT JOIN
           ..........
        (抽出周7数据From事件详情表WHERE 事件发生日期=周7)AS WEEK7 

#2


WEEK1-7的LEFT JOIN忘记写ON条件了,自己补下吧,就是员工号相等,
这样做的好处是表结构简单,插入部分的程序好做。

#3


引用 1 楼 richman2012 的回复:
给你个最简单的做法:
表结构仅单纯的记录下最小事件单位的信息即可
如:
1.事件详情表
工号,事件发生时间,事件内容
2.员工表
工号,姓名
然后抽出的sql思路是,将周1-7每天的事件详情做成子查询1,将员工表数据按照能抽出这5位领导的条件做成子查询2,再把这两个子查询关联起来即可
大概是这样的
select 
T.员工号,
WEEK1.事件内容,
......
WEEK7.事件内容
from (抽出5位领导from员工表where 工号 in (5位领导工号)) T1 LEFT JOIN
       (抽出周1数据From事件详情表WHERE 事件发生日期=周1) AS WEEK1 LEFT JOIN
        (抽出周2数据From事件详情表WHERE 事件发生日期=周2)AS WEEK2 LEFT JOIN
           ..........
        (抽出周7数据From事件详情表WHERE 事件发生日期=周7)AS WEEK7 

啊,您是做过?必须得这样吗??

#4


常有这样的场景啊,比如出月度报表
上边标题是月度,左边是部门,中间是部门销售额
但是不是每个月每个部门都有销售额的,
这个算简单的,有时候标题有2层,还要第一层月度,第二层是商品名称
你这个固定7天属于最好做的,我碰到过不定的,也就是刚说的商品名称不是固定几个,根据数据,有发生数量的
才输出这列。

#5


我不知道你最后报表哪什么工具出,如果是excel
可以用数据透视表,直接读取那个表就可以了,表结构不需要做的特殊

#6


引用 5 楼 richman2012 的回复:
我不知道你最后报表哪什么工具出,如果是excel
可以用数据透视表,直接读取那个表就可以了,表结构不需要做的特殊

我打算用你说的方式,只是我刚才在做的时候发现,同一人的同一天上午有可能有多条事件呀,你这样列出来的是每个人每天上午或下午只能一件事,如果有更好的方式说出来听听,呵呵,我暂时着急先用这种方式,单独弄一个表,把多条事件写到一个字段里,用标识符隔出来,这样就一次性取出了,否则用sql函数组合出字段会有点慢

#7


引用 6 楼 xiaoliuvv 的回复:
Quote: 引用 5 楼 richman2012 的回复:

我不知道你最后报表哪什么工具出,如果是excel
可以用数据透视表,直接读取那个表就可以了,表结构不需要做的特殊

我打算用你说的方式,只是我刚才在做的时候发现,同一人的同一天上午有可能有多条事件呀,你这样列出来的是每个人每天上午或下午只能一件事,如果有更好的方式说出来听听,呵呵,我暂时着急先用这种方式,单独弄一个表,把多条事件写到一个字段里,用标识符隔出来,这样就一次性取出了,否则用sql函数组合出字段会有点慢

应该没问题的,我只是给你个大致思路,你在事件详情表中做一个序列号(1开始计数)字段
员工ID+序列号作为主键即可存放同一天同一个员工的多个事务了。



#8


引用 6 楼 xiaoliuvv 的回复:
Quote: 引用 5 楼 richman2012 的回复:

我不知道你最后报表哪什么工具出,如果是excel
可以用数据透视表,直接读取那个表就可以了,表结构不需要做的特殊

我打算用你说的方式,只是我刚才在做的时候发现,同一人的同一天上午有可能有多条事件呀,你这样列出来的是每个人每天上午或下午只能一件事,如果有更好的方式说出来听听,呵呵,我暂时着急先用这种方式,单独弄一个表,把多条事件写到一个字段里,用标识符隔出来,这样就一次性取出了,否则用sql函数组合出字段会有点慢

或者偷懒的话直接用员工号+时间(datetime)+做主键

#9


引用 6 楼 xiaoliuvv 的回复:
Quote: 引用 5 楼 richman2012 的回复:

我不知道你最后报表哪什么工具出,如果是excel
可以用数据透视表,直接读取那个表就可以了,表结构不需要做的特殊

我打算用你说的方式,只是我刚才在做的时候发现,同一人的同一天上午有可能有多条事件呀,你这样列出来的是每个人每天上午或下午只能一件事,如果有更好的方式说出来听听,呵呵,我暂时着急先用这种方式,单独弄一个表,把多条事件写到一个字段里,用标识符隔出来,这样就一次性取出了,否则用sql函数组合出字段会有点慢

还有你的ON条件没写错吧,都是
T1.员工号=Week1.员工号
T1.员工号=Week2.员工号
T1.员工号=Week3.员工号
类似这样的,不要写成Week1.员工号=week2.员工号啊

#1


给你个最简单的做法:
表结构仅单纯的记录下最小事件单位的信息即可
如:
1.事件详情表
工号,事件发生时间,事件内容
2.员工表
工号,姓名
然后抽出的sql思路是,将周1-7每天的事件详情做成子查询1,将员工表数据按照能抽出这5位领导的条件做成子查询2,再把这两个子查询关联起来即可
大概是这样的
select 
T.员工号,
WEEK1.事件内容,
......
WEEK7.事件内容
from (抽出5位领导from员工表where 工号 in (5位领导工号)) T1 LEFT JOIN
       (抽出周1数据From事件详情表WHERE 事件发生日期=周1) AS WEEK1 LEFT JOIN
        (抽出周2数据From事件详情表WHERE 事件发生日期=周2)AS WEEK2 LEFT JOIN
           ..........
        (抽出周7数据From事件详情表WHERE 事件发生日期=周7)AS WEEK7 

#2


WEEK1-7的LEFT JOIN忘记写ON条件了,自己补下吧,就是员工号相等,
这样做的好处是表结构简单,插入部分的程序好做。

#3


引用 1 楼 richman2012 的回复:
给你个最简单的做法:
表结构仅单纯的记录下最小事件单位的信息即可
如:
1.事件详情表
工号,事件发生时间,事件内容
2.员工表
工号,姓名
然后抽出的sql思路是,将周1-7每天的事件详情做成子查询1,将员工表数据按照能抽出这5位领导的条件做成子查询2,再把这两个子查询关联起来即可
大概是这样的
select 
T.员工号,
WEEK1.事件内容,
......
WEEK7.事件内容
from (抽出5位领导from员工表where 工号 in (5位领导工号)) T1 LEFT JOIN
       (抽出周1数据From事件详情表WHERE 事件发生日期=周1) AS WEEK1 LEFT JOIN
        (抽出周2数据From事件详情表WHERE 事件发生日期=周2)AS WEEK2 LEFT JOIN
           ..........
        (抽出周7数据From事件详情表WHERE 事件发生日期=周7)AS WEEK7 

啊,您是做过?必须得这样吗??

#4


常有这样的场景啊,比如出月度报表
上边标题是月度,左边是部门,中间是部门销售额
但是不是每个月每个部门都有销售额的,
这个算简单的,有时候标题有2层,还要第一层月度,第二层是商品名称
你这个固定7天属于最好做的,我碰到过不定的,也就是刚说的商品名称不是固定几个,根据数据,有发生数量的
才输出这列。

#5


我不知道你最后报表哪什么工具出,如果是excel
可以用数据透视表,直接读取那个表就可以了,表结构不需要做的特殊

#6


引用 5 楼 richman2012 的回复:
我不知道你最后报表哪什么工具出,如果是excel
可以用数据透视表,直接读取那个表就可以了,表结构不需要做的特殊

我打算用你说的方式,只是我刚才在做的时候发现,同一人的同一天上午有可能有多条事件呀,你这样列出来的是每个人每天上午或下午只能一件事,如果有更好的方式说出来听听,呵呵,我暂时着急先用这种方式,单独弄一个表,把多条事件写到一个字段里,用标识符隔出来,这样就一次性取出了,否则用sql函数组合出字段会有点慢

#7


引用 6 楼 xiaoliuvv 的回复:
Quote: 引用 5 楼 richman2012 的回复:

我不知道你最后报表哪什么工具出,如果是excel
可以用数据透视表,直接读取那个表就可以了,表结构不需要做的特殊

我打算用你说的方式,只是我刚才在做的时候发现,同一人的同一天上午有可能有多条事件呀,你这样列出来的是每个人每天上午或下午只能一件事,如果有更好的方式说出来听听,呵呵,我暂时着急先用这种方式,单独弄一个表,把多条事件写到一个字段里,用标识符隔出来,这样就一次性取出了,否则用sql函数组合出字段会有点慢

应该没问题的,我只是给你个大致思路,你在事件详情表中做一个序列号(1开始计数)字段
员工ID+序列号作为主键即可存放同一天同一个员工的多个事务了。



#8


引用 6 楼 xiaoliuvv 的回复:
Quote: 引用 5 楼 richman2012 的回复:

我不知道你最后报表哪什么工具出,如果是excel
可以用数据透视表,直接读取那个表就可以了,表结构不需要做的特殊

我打算用你说的方式,只是我刚才在做的时候发现,同一人的同一天上午有可能有多条事件呀,你这样列出来的是每个人每天上午或下午只能一件事,如果有更好的方式说出来听听,呵呵,我暂时着急先用这种方式,单独弄一个表,把多条事件写到一个字段里,用标识符隔出来,这样就一次性取出了,否则用sql函数组合出字段会有点慢

或者偷懒的话直接用员工号+时间(datetime)+做主键

#9


引用 6 楼 xiaoliuvv 的回复:
Quote: 引用 5 楼 richman2012 的回复:

我不知道你最后报表哪什么工具出,如果是excel
可以用数据透视表,直接读取那个表就可以了,表结构不需要做的特殊

我打算用你说的方式,只是我刚才在做的时候发现,同一人的同一天上午有可能有多条事件呀,你这样列出来的是每个人每天上午或下午只能一件事,如果有更好的方式说出来听听,呵呵,我暂时着急先用这种方式,单独弄一个表,把多条事件写到一个字段里,用标识符隔出来,这样就一次性取出了,否则用sql函数组合出字段会有点慢

还有你的ON条件没写错吧,都是
T1.员工号=Week1.员工号
T1.员工号=Week2.员工号
T1.员工号=Week3.员工号
类似这样的,不要写成Week1.员工号=week2.员工号啊