SQL表设计问题。如果表述错误。请谅解

qian386620 2018-03-12 04:35:57


A、B两表是在开发过程中,遇见别人设计时的2种模式。比较好奇这2种表设计模式有什么区别;自己在开发过程中一般都是用的A模式,因为简单。写SQL什么也方便,但是看公司一个开发多年的同事,他大多数是用的B模式下的。准备百度但是不知道如何百度,所以只好在此请教(数据是瞎写的)
...全文
317 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lich2005 2018-03-13
  • 打赏
  • 举报
回复
都设计的不好,都没遵循应有的范式(除非是有意的反模式设计)
shoppo0505 2018-03-13
  • 打赏
  • 举报
回复
引用 4 楼 superwfei 的回复:
其实在有行列转换的情况下,使用起来差不多,但维护的话,列模式比行模式方便一些 比如,查找任意科目有大于90分的同学的所有成绩
-- A表方式
;with t as (
	select 1 as id,'张三' as 姓名,100 as 数学,50 as 语文,60 as 英语,54 as 化学
	union all
	select 2,'李四',52,86,30,21
	union all
	select 3,'王五',65,45,57,55
	union all
	select 4,'赵六',80,33,25,65
	union all
	select 5,'田七',95,69,35,99
)
select * from t a 
where exists(
	select * from t b
	unpivot (value for field in (数学,语文,英语,化学)) c
	where id=a.id and value>90
)
-- B表方式
;with t as (
	select 1 as id,'张三' as 姓名,100 as 数学,50 as 语文,60 as 英语,54 as 化学
	union all
	select 2,'李四',52,86,30,21
	union all
	select 3,'王五',65,45,57,55
	union all
	select 4,'赵六',80,33,25,65
	union all
	select 5,'田七',95,69,35,99
),t1 as (
	select row_number() over(order by id,field) as id,姓名,field as 科目,value as 成绩 from t a
	unpivot (
		value for field in (数学,语文,英语,化学)
	) b
)
select 姓名,数学,语文,英语,化学 from (select 姓名,科目,成绩 from t1) a 
pivot(
	max(成绩) for 科目 in (数学,语文,英语,化学)
) p
where 姓名 in (
	select distinct 姓名 from t1 where 成绩>90
)
这个完全是两码事。 就像2,3#说的,增加,减少科目,都需要更改表格结构,这样的话,光数据库层面更改就会很麻烦,何况前台的object也会需要修改。
中国风 2018-03-13
  • 打赏
  • 举报
回复
在开发设计时要两者结合去应用,以课程为用B模块是通用软件开发,A模块只适用定制开发,只针对这类业务开发
中国风 2018-03-13
  • 打赏
  • 举报
回复
在设计的角度上用B模式灵活有扩展性,当科目发生变化时不需要去改变表结构,缺考时没记录,省空间 在业务的角度上用A模式固定没扩展性,当科目发生变化时需新增列,当缺考时会存在NULL,0表示为0分
文盲老顾 2018-03-13
  • 打赏
  • 举报
回复
其实在有行列转换的情况下,使用起来差不多,但维护的话,列模式比行模式方便一些 比如,查找任意科目有大于90分的同学的所有成绩
-- A表方式
;with t as (
	select 1 as id,'张三' as 姓名,100 as 数学,50 as 语文,60 as 英语,54 as 化学
	union all
	select 2,'李四',52,86,30,21
	union all
	select 3,'王五',65,45,57,55
	union all
	select 4,'赵六',80,33,25,65
	union all
	select 5,'田七',95,69,35,99
)
select * from t a 
where exists(
	select * from t b
	unpivot (value for field in (数学,语文,英语,化学)) c
	where id=a.id and value>90
)
-- B表方式
;with t as (
	select 1 as id,'张三' as 姓名,100 as 数学,50 as 语文,60 as 英语,54 as 化学
	union all
	select 2,'李四',52,86,30,21
	union all
	select 3,'王五',65,45,57,55
	union all
	select 4,'赵六',80,33,25,65
	union all
	select 5,'田七',95,69,35,99
),t1 as (
	select row_number() over(order by id,field) as id,姓名,field as 科目,value as 成绩 from t a
	unpivot (
		value for field in (数学,语文,英语,化学)
	) b
)
select 姓名,数学,语文,英语,化学 from (select 姓名,科目,成绩 from t1) a 
pivot(
	max(成绩) for 科目 in (数学,语文,英语,化学)
) p
where 姓名 in (
	select distinct 姓名 from t1 where 成绩>90
)
RINK_1 2018-03-12
  • 打赏
  • 举报
回复
觉得应该是B比较普遍吧,就像#2说的,一旦科目有调整,扩展就比较容易,而A就需要修改表结构增加字段了。 但是B应该记录姓名和科目的ID。
mywisdom88 2018-03-12
  • 打赏
  • 举报
回复
A模式,记录行数会比较少,不易扩展 B模块,记录行数会比较多,但他容易扩展,增加科目,不需要改变表结构,
shoppo0505 2018-03-12
  • 打赏
  • 举报
回复
数据不光只是记,还要考虑到用,直接不用的数据就是垃圾。 提2个需求: 你看看用哪种结构方便。 1. 我要所有大于90分的数据。 2. 我要根据分数排序。
通过慢sql分析的学习,了解什么是慢sql,以及慢SQL会引起那些性能问题。清楚慢sql日志的设置,然后再通过慢sql分析工具的学习,清楚慢sql分析的步骤和流程。慢sql分析工具:mysqldumpslow工具、explain工具、profile工具、Optimizer Trace工具。 提供课程中所使用的sql语句。 课程内容:第一章:课程简介1、课程介绍2、课程大纲 第二章:慢sql简介1、慢sql简介2、慢sql会引起的问题 第三章:慢日志的设置1、慢sql的分析流程2、慢日志参数理解3、慢日志参数设置:第1种方式:my.ini文件设置4、慢日志参数设置:第2种方式:sql脚本设置5、慢日志参数设置-效果验证 第四章:如何发现慢sql1、如何发现慢sql:第1种方式:慢日志文件2、如何发现慢sql:第2种方式:mysql库的slow_log 第五章:慢sql分析工具1、慢sql提取-mysqldumpslow工具-使用方法2、慢sql提取-mysqldumpslow工具-操作实战3、慢sql的执行计划分析-explain分析-执行计划结果说明4、慢sql的执行计划分析-explain分析-索引介绍+type类型举例5、慢sql的资源开销分析-profile分析-分析步骤6、慢sql的资源开销分析-profile分析-show profile执行阶段说明7、慢sql的资源开销分析-profile分析-完整列说明+操作实战8、慢sql的跟踪分析-Optimizer Trace分析-分析步骤9、慢sql的跟踪分析-Optimizer Trace的介绍10、索引失效场景举例 第六章:慢日志清理1、慢日志清理

34,577

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧