Re: [请益] db要分table还是用一个field分类

楼主: littlethe (东周流浪汉)   2018-08-28 22:15:30
这其实在大学就会学到的观念了,
虽然我感觉大学的数据库很多人教得不太好,
教得太抽象很容易让人听不懂...
anyway,
以我判断,
这状况要拆成3张表,
甲表是共用field,
乙表是A情境用,
丙表是B情境用,
然后甲表和乙表做成view专门给A情境用,
甲表再和丙表做成view给B情境用,
举例子来讲会比较好懂,
我们要设计游戏,
游戏里有文官和将军,
将军没有行政属性,不能做行政职,
但有战斗属性,可以带兵,
文官有行政属性没战斗属性,可以做行政,但不能带兵,
所以我会先建一张表叫人物表,
表上有姓名,性别,生日等所有人物都有的属性
(当然这时候会有天兵用年龄当field而不是生日,这就要打屁股了)
另一张表叫将军表,
属性有人物id,可以join到人物表,
还有战斗能力,战斗经验值,
再一张表叫文官表,
属性有人物id,外交能力,内政能力,研究能力...
再把将军表和人物表变将军view,
文官表和人物表变文官view,
要为军队选择将军时,就读将军view,
要选内阁时,就读文官view,
要看人物列表时,就只读人物表,
当然会有人既是将军也是文官,例如凯末尔或艾森豪,
但在这种结构下,这种全才会同时存在将军与文官的view中,
所以不用担心
设计数据库的道理和OO有共同之处,
就是一个表,和一个field最好只有一个很明确的存在目的,
而且要尽量让结构可以很灵活的组合,
就像变形金钢一样可以变来变去,
如果一个表用来做一大堆事的话,
那就会变得很难维护了...一动就会扯到很多事,
细节前面与推文也很多人有讲了就不多说,
要注意的地方大概就是要看一张表的数据量会不会超大,
如果超过百万笔的话就要注意,
因为百万笔的表再join其他表的话,很可能有效能问题,
如果要让效能提升,
只做成2张表也行,各自应付A情境和B情境而不join,
就是所谓的反正规化,
但这样做的缺点是若要查A情境和B情境共同的东西时的话,
就得用union了,
如查人物列表,变成要文官表union将军表,
用field去把一个表模拟成两张表...
我目前是想不到这样做有什么好处啦,
比较像是有人没受过数据库训练,
自己幻想出的solution,
等A情境需要加些field或key,
B情境也需要加些field或key,
再来个C情境要加些field,
你就会看到传说中的数据库大魔王表,一张有上百个field的表,
你就可以唱首歌,
"我们的table,一眼望不完~,数不完的fields,峰峰相连到天边~",
实务上我也碰过几次这种前人留下的资料表坑,
费了九牛二虎之力还不一定解决得完,
因为表用在正式系统后,就不能随便动了,动了容易出事,
所以会这样告诉你,
也发现虽然数据库大家都在用,
但很多人不太会设计,
有时候还真想去当老师教数据库
※ 引述《asleepme (500年没换暱称了)》之铭言:
: 请教dba神人,之前遇到一个应用情境是这样
: 我们有一组核心资料,跟2种服务
: 这2个服务(A、B)会用核心资料,去呈现不同的应用
: 所以A、B会有部分相同功能、部分不同功能
: 例如A会有功能 G、X、Y
: B会有功能 H、X、Y
: X、Y是一样的功能只是A情境下用,或是B情境下用
: 所以X、Y功能在db中需要的structure也是一样
: A、B储存在X、Y里面的资料是互相独立的,没有任何关联
: 也就是说,在情境A下存进A.X的资料B完全不知道也没差
: 在这情况下,我们可以为A的X功能建立一个 A_func_X 的table
: 同样,B的X功能也可以建立一个 B_func_X 的table
: 但是这2个table的structure会一模一样
: 也可以A、B共用一个table func_X
: 里面有一个field叫type存A、或B,代表是哪个服务所建立的资料
: 想请教一下2种作法都适合吗?
: 会有什么后续要注意的状况?
作者: qa17b (圣猿降临 众酸退散)   2018-08-28 22:43:00
签名档有点悲伤
作者: bheegrl   2018-08-28 22:51:00
一丝快乐吗?推抗"游戏3人娘",但是别在吃东西的时候看*坑
作者: t64141 (榕树)   2018-08-28 23:02:00
1没设计好的资料表要重构真的难
作者: johnny94 (32767)   2018-08-28 23:51:00
最尴尬的是你正确设计还会被没学过的乱批评
作者: agogoman (cocorosie)   2018-08-29 00:10:00
我看过中文讲数据库设计最深入浅出的是独孤木的那一个系列, 我都建议先看过那一系列然后再回头啃教科书, 相对会比较有感觉.
作者: TAKADO (朕没给的你不能抢)   2018-08-29 01:03:00
而且你去问乱设计的还会放大绝说 没差啦 这个有差吗?随便啦
作者: jj092357q4e3 (土拨鼠)   2018-08-29 01:05:00
情境想的颇有趣,给推
楼主: littlethe (东周流浪汉)   2018-08-29 01:15:00
因为怕被人取代呀,所以很多人宁可一直做错也不愿认错这也就是为什么我不喜欢再去小公司了,因为小公司没钱请能力好的人,就请一堆基础很差自己摸出来的,就很容易将错就错,去攻击对的人,变成劣币趋逐良币,久了公司就变得很恐怖...看公司正不正常,真的看薪水就可以推测出来
作者: xdraculax (首席怪叔叔)   2018-08-29 02:17:00
作者: pzyc79   2018-08-29 03:18:00
我也是这么想的 但是没办法像这样解释的这么清楚
楼主: littlethe (东周流浪汉)   2018-08-29 03:31:00
看来常打电动的好处就是可以举出大家好理解的例子
作者: welcome0 (coest)   2018-08-29 09:47:00
有时候会被ㄎㄅ说over design,但到了一定量就很难动啊...
作者: iamyiz (Gigahertz)   2018-08-29 09:48:00
推。签名档qq
作者: johnny94 (32767)   2018-08-29 10:23:00
有时候基本常识被说成是 over design 的情况也是很常见的
作者: a926 (Aaron)   2018-08-29 11:01:00
老师教教窝
作者: ericsung (WOW WOO)   2018-08-29 13:18:00
一堆只会乱做又不承认自己错 也不愿改 懒得改
楼主: littlethe (东周流浪汉)   2018-08-29 15:08:00
over design确实也会存在,但这很主观,不管是不是overdesign,至少设计者要有设计数据库的观念,有观念,要补要修,要赶时间的话,也才知道要怎么应对各种状况而不是呆呆的自己胡思乱想乱猜怎么做
作者: realbout (萨摩诃)   2018-08-29 20:57:00
怪了 这不就是正规化的目的...
作者: THEWORLDS (天下)   2018-08-29 22:54:00
dba太缺就是这样 遇到会弄得直接转出资料重弄一个才爽乱搞成本有时候会多出好几E 不如花多点钱请一个好的DBA不过台湾小公司大多是这样 15万打死
楼主: littlethe (东周流浪汉)   2018-08-30 01:54:00
但我发现很多公司没有请DBA的念头,也不知道正规化
作者: hakama99 (杂酱面)   2018-08-31 16:46:00
这情况我应该会拉两个表单 一个将领table一个将领能力表单 字段有将军ID,type(军师,军人),能力文武官不然你的做法以后多一个宦官或其他类型的 就要多开表单仔细看了一下妳说的才是对的 不同类型字段会不同 SORRY~
作者: zased (我只是上PTT查资料)   2018-09-01 03:57:00
这篇写得很好,感谢分享
作者: asleepme (500年没换暱称了)   2018-09-03 17:01:00
+1 收益良多,值得收藏 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com