[讨论] 想请教一下各位大大数据库设计的几个概念

楼主: MashiroKinji (MashiroKinji)   2017-08-22 00:07:31
小弟虽然有些Server端的经验 但最近几年都是是专职Client端程式
所以可能有点生疏还是说思想跟不上时代了!?
还请各位大大指点一下
疑问1
最近看到一个Server端工程师开出了类似像下面的资料表结构
A 表
ID Column1 Column2 Column3
1 10 20 30
2 10 20 30
3 10 20 30
B 表
ID Column1 Column2 Column3
1 1 2 3
1 4 5 6
2 1 2 3
其中ID是索引 A表和B表的字段名称是同步的且型别都一样
A表和B表是乘数和被乘数的关系
以ID 1 来说
我们程式最后需要的加总值是
Column1 = 10 + (10 * 1) + (10 * 4)
Column2 = 20 + (20 * 2) + (20 * 5) 以此类推
如果B表相同ID的只有出现一次当然后面(X * Y)的次数就只有一次如果没有就是没有
当初我Client收到这张表的时候第一个直觉就是不能设计成下面这样吗?
A 表
ID CID
1 1
2 2
3 3
B 表
ID CID
1 4
1 5
2 6
多一张C表 其中A B表的CID是关联索引到C表的ID的
C 表
ID Column1 Column2 Column3
1 10 20 30
2 10 20 30
3 10 20 30
4 1 2 3
5 4 5 6
6 1 2 3
这样的话未来如果有Column4 出现的时候我们只要改一个表就好了
更何况实际状况是类似B表的表有好多个 所以到时候真的有Column4出现的时候
就必须要更动许多表格还有可能有遗漏的状况
不过我同事是用两大理由反驳我的
1. 他的做法阅读比较容易
2. 因为一个是乘数一个是被乘数性质不同
不知道各位大大的看法呢?
接这是疑问2 跟上面有关系
因为现在Server端是捞到资料就把整陀资料包含着ID
就直接Call To Json的function转成Json string丢过来了(先不管加密)
(有分乘数和被乘数两次给)
但是我认为假如果是使用者ID 1 我当然跟你要的资料一定就是ID == 1 不是吗?
整个Row的资料都丢过来 如果今天字段中有密码不就一起丢过来了???
虽然Client不会无端的没事情把这个资讯秀出来
可是如果封包被拦截 就有密码被盗取的可能性不是吗?
而且丢一堆我不需要的参数不是也有一些不必要的浪费吗?
所以我自己是认为Server程式捞完数据库后应该要把Client需要的资讯做个整理
把必要的资讯传过来就好了....(不管是不是你要开一个新结构再转乘Json也是
最后疑问3 (对不起问题很长> <
其实Server那边说他们常常也有用到加总值 要用在Server的计算中
(虽然我不知道他要干嘛)
说是因为常常要算 所以他们有自己再创一张表把结果占存(暂且叫做S表
后来我发现这个结果再后来也有传到Client (跟上面的问题有隔一段时间了
PS. 中间有段时间我跑去接其它的部分交接给其他人 所以才是"后来"发现
这时我又想了几个问题
因为我们必须显示最终值的计算方式所以不可以只传最后结果给我
因此此时Client端有3个表S 和A和B
但是S表的结果可以从A 和 B推算出来
这时就有几个方案了
1. 我这边的结果拿S表 计算公式拿A B表显示 如果计算公式出包就是Server端的问题
2. S表不用传过来Server要用自己隐藏好就好系统间不打架 S表我自己算
3. 拿S还是自己算随便都可以(被打
因为S的值有不同发法可以取到
让龟毛的我感到有不确定性
我认为对一个系统来说一个有关系的数值不应该有不同的取法 要保有唯一性
因为如果哪天发现公式计算
错误的话就不能第一时间知道是Client还是Server运算错误
还是说A B表更新S表没有refresh
各位有什么看法了
还请各位大大给点指教
作者: tedcat (动静:MSN暱称为主)   2017-08-30 18:00:00
问题太长我回答第一个XD 两个做法都可以。 第一个好处跟坏处你都提到了,但确实比较直觉。 而你的做法与其分ab表不如弄成一表 然后多一个字段分辨乘数被乘数。

Links booklink

Contact Us: admin [ a t ] ucptt.com