和其他开发合作,如果理念不同也是很难受啊。。

2018-06-02 12:12:30 +08:00
 yang2yang

背景:开发一个新项目,一个前端、两个开发、一个项目经理。

刚开始开发大家也没啥矛盾,一个正经地开会、讨论、分配任务、各干各的活。开始大家还是比较愉快的,之后就发生了这个几件小事。

  1. 定义一个数据库的字段,用来表示这条记录的 type(类型)。整张表一开始都是本人定义的,开始就想定义成 varchar 类型的,在代码里面定义好枚举,然后愉快继续开发。到后来,被开发同事(以后用 C 指代)看到(因为这个时候要使用到这张表)之后。

    C:"这个字段 type 改成 int 吧。"。

    wo:"为啥?当时定义成 varchar,考虑到可读性好一点,如果 int,好处是节省空间嘛。不过,这张表记录不会超过几百个条记录,还是 varchar 好一点。"

    C:"一般这个类型一般都是使用 int 类型的,你这样以后出了啥问题怎么办"

    wo:"能有啥问题?"

    C:"现在当然还看不出来,万一以后出了,这种都不好改。"

    wo:"....."

    最后还是没改。

    另公司没有代码习惯数据库的定义的规范,而且公司一般用 varchar 来定义类型。

  2. 还是数据库的设计问题。用了随机生成的 uuid 做主键,被看到后,告诉 wo 要加一个自增 id。wo:"为啥?",C :"一般表都会有个自增的作为主键的。" wo:"表 1 表 2 会被表 3 引用到主键,所以表 1 表 2 的主键要唯一,自增不 符合。" C:"引用的时候用 uuid,但是自增 id 还是加一个吧。" wo:"..." 最后还是加了一个。

  3. 当然其实不止数据库了。还有,C 写的模块要有一个函数需要被 wo 调用。当开始写了一个传一个参数的,后来考 虑到可能有批量调用的场景。就又写了一个可以传 list 的接口。然后,就把之前那个给删了。wo:"别删啊, 留着呗。" C:"有 list 的就够了,干嘛要那个。。" wo:"好吧...."

之前也经常和别人合作写代码,虽然也有这种习惯、写法不一致的情况,但是发生的次数还是比较少。但这次,发生地是最频繁的了。有时候争执的时候妥协,有时候要据理力争。最近,也在烦恼,到底是为什么会这样?是 wo 的太固执,还是别人做法不对。最烦的时候,想想还是一个人开发的时候爽。安静下来想想,如果合作的好,还能从别人身上吸收到不少好处。也许一种相对来说好的方式来解决各自觉得有道理的情况是不是 "自己的模块怎么实现的尽量按自己的思路来,别人怎么实现的也别去管"。

当然虽然合作的不愉快,不过写代码的人都是善良的。

深知自己所知甚浅,很想得到各位大佬一路走来的经验分享,能有自己的心路历程就更好了。

5817 次点击
所在节点    程序员
64 条回复
zjsxwc
2018-06-02 16:27:07 +08:00
@zjsxwc

第二个,比如竞争插入时,以 id 最小的为准
GuuJiang
2018-06-02 16:46:13 +08:00
@oovveeaarr myisam 确实是你说的这种情况,因为 myisam 根本就没有聚集索引,采用的是“堆式”存储,就类似于系统的操作系统堆内存的分配一样,插入记录时从可用空间中分配,删除以后回收为可用空间,而 innodb 每个表有且仅有一个聚集索引,行数据是伴随着聚集索引一起存储的,所以自增主键是十分有必要的
wizardforcel
2018-06-02 16:47:07 +08:00
能删的代码尽量删,这样可以强迫大家都学着用版本控制工具

如果哪天要用了,可以从历史提交中找回来,显得你的工作量比较大 XD
notreami
2018-06-02 17:01:53 +08:00
前两个都是扩展问题,不好评论。毕竟还有过度设计的问题
第三个,内部实现合并起来比较好,统一实现。但是接口也合并,请求耗时监控就不好区分了。TP50 与 TP90 可以天差地别。
xiaket
2018-06-02 17:05:40 +08:00
这都还谈不上理念问题, 都只是代码审美观不一样罢了
takato
2018-06-02 17:27:15 +08:00
第三个问题有一个比较现实的例子。。
一些金融交易所会同时提供插入一个订单和插入一批订单的接口,但是在两个不同的 URI 下的,且会同时提供。
接口的消耗不一样,同时存在有时候也是有意义的。
1762628386
2018-06-02 17:32:40 +08:00
都没回答到点子上 这明显是制度问题 楼主公司明显没有 代码 /开发规范 才会出现这种上级强压下级服从的情况
akira
2018-06-02 17:44:02 +08:00
2. 个人习惯是 所有的表,都应该有一个 业务无关联的自增字段。另外还有可能要 2 个字段 记录创建时间和最后更新时间.
blless
2018-06-02 17:51:55 +08:00
1 3 很多人讨论了,2 关于 uuid 主键的问题 游戏那种区服要合服你们就可以感受自增 id 的痛苦了,尤其还依赖自增 id 干了啥事 当然单个库就当我没说,自增主键还是很爽的
q397064399
2018-06-02 17:58:07 +08:00
@oovveeaarr #39 B+树的特性就决定了 顺序插入是最好的
q397064399
2018-06-02 18:03:02 +08:00
Innodb 是聚集索引,,所有行信息 都是存在 主键列,所有索引列 非覆盖索引方式的查询 需要查询完索引后,通过主键 id 找到完整的数据行,所以很多时候为了性能一般会采取覆盖索引查询的方式 ,主键列是 b+树实现,b+的特性决定 顺序插入是最理想的,另外分库分表 应该以其它列的 hash 来决定。 另外整个 innodb mvcc 多版本并发机制了解一下

http://hedengcheng.com/?p=771

这篇文章值得一读。
wangxiaoaer
2018-06-02 18:15:50 +08:00
@arthasgxy 你们的数据库表记录都不加时间戳的?
arthasgxy
2018-06-02 18:23:14 +08:00
@wangxiaoaer 不就我说的 ts 么
arthasgxy
2018-06-02 18:25:16 +08:00
@wangxiaoaer 我的意思是,比如我大概有印象,一个表, 每分钟入库 1000 条。
大约半小时前的数据 就是 max(id)-1000*30 对不? max(id) 一般个人习惯是 order by id desc 看一下, 剩下的脑算一下就有结果了。

而用时间戳, 你要转换时间才能大概锁定位置不是么
sagaxu
2018-06-02 18:31:47 +08:00
1,枚举类型用 int 还是 string? 当然是 int 了,然后再定义一张 reference 表,描述各个 int 的含义
2,自增还是 uuid? 业务决定,一般无脑自增,除非数据量过十亿或者有不同 db 并表的需求
3,支持 list 接口还要支持单个的吗?维护一个接口比维护两个接口成本低,调用 list 比调用单个的成本差不多
wangxiaoaer
2018-06-02 18:44:45 +08:00
@arthasgxy 我是觉得时间转换很直观,数据库内置的日期函数比较放便。
my3157
2018-06-02 19:42:30 +08:00
1. 枚举大多还是会用 int, 有时候为了可读性也会用 string, 但是对于比较复杂的, 比如库存, 支付等, 会仔细规划一下, 不会采用 1,2,3 这样连续的, 一般会先规划好每个段, 比如 1-100,101-200, 好处是有时候会需要用范围查询, 简单情况下, int 和 string 没区别, 个人喜好
2. 同意 @sagaxu #55 一般无脑自增, 集群情况下要特殊考虑, 现在很多 mysql 集群方案是多主, 自增需谨慎
3. 接口不要随便删, 尤其是有外部依赖的时候,
helloworldgo
2018-06-02 22:06:58 +08:00
理念不同我能接受,不能接受脾气合不来的,现在就有些同事是话没说两句就不耐烦,跟欠钱了似的。
yuanfnadi
2018-06-02 22:33:55 +08:00
如果是 innodb,使用自增 id 更好,这个数据库都储存方式有关。楼上说得很清楚了。
wr410
2018-06-02 22:52:49 +08:00
第一个,做数字比较的时候就有区别了。但是如果只是做标识,那标识就别定成数字不就好了,这样你就可以理直气壮了;

第二个,uuid 做主键本身没问题,考虑到数据量很大的时候就有区别了,至少浪费空间吧;

第三个,这个时候就应该好好利用重载了,主方法写在原子参数上,然后 list 什么的包装方法就直接循环调主方法就可以了;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/459780

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX