每次需求交到自己手上,对于业务设计和数据库设计都感觉比较难下手,要么:

设计不够合理,需要重来
设计方案性能不够高或者后期维护麻烦
另外的同事来做的话,会有更好的抽象,更合理的分层

想解决一下目前的困境,大家有没有相关的书籍或者资料推荐学习一下?

发帖的目的是来求术的,而不是来求道的。麻烦大家给具体方向或者数据,分享 道 的大佬们可以先不发言了~等我到了那个层次再来求教~

看看 DDD

从简入难,mvc 多看表设计

麻烦问下有书籍推荐的吗?

《解构领域驱动设计》《架构整洁之道》《分析模式:可复用的对象模型》

逻辑、抽象、复用,思维体系三基石

有没有具体的?

像这种回答应该被推荐

理清楚业务之间的关系应该不是件难的事情,难以下手往往是想太多,过度设计。

找准两三个开源项目彻底吃透

可以先看现已上线的系统功能需求,想想自己来设计会怎么设计库表及代码结构。然后看现有代码怎么实现的,存在不合理和合理的,一目了然。如果项目没有现成的已实现功能,可以列出自己的思路,找同事私下把把关,探讨一下。最后再配合楼上说的书籍加深理解,上来就看书,太理论,个人觉得对新人不友好。

如果不是交易系统那种一点不能错的我反而不重视数据库设计,包括三范式也不遵循,关系数据库里大量用到 json 字符串,外键也不用.我觉得关系模型太繁琐了.

www.mongodb.com/basics/database-architecture你问的太宽泛了,那我也只好宽泛地说根据需要选 Tier1~3 的架构至于具体选哪个 tier ,选好了之后怎么设计各个 layer ,得结合实际业务来

谢谢,挺好的建议

内练:《实现领域驱动设计》(Vaughn Vernon 著, 滕云 译) (要准备上几年慢慢练,不然容易走火入魔。)外练:Entity Relation Diagram/Design/Modeling 。相关参考如下:方法 www.cnblogs.com/muchen/p/5258197.html 关系的名称和方向 stackoverflow.com/questions/15941149/how-we-identify-the-relation-direction-in-an-er-diagram-if-we-use-chens-notation陈氏表示法 vertabelo.com/blog/chen-erd-notation/乌鸦脚表示法(多重性上一般不用原始陈氏表示法而换用乌鸦脚表示法) vertabelo.com/blog/crow-s-foot-notation/请注意:不管是 DDD ,还是 ERD ,都不是单纯的技术设计,而是业务模型设计,产品/需求也是要参与的。如果产品/需求压根不管你啥模型,就盯着界面原型甚至效果图,还拒绝被模型引导,那你搞啥都不管用。

我的理解是,数据和数据库是不同的,先理业务,理解你的数据流让数据走通整个流程,当你做完这一切的时候数据库只是最后保存的那一下,没什么难度了

业务设计可以用状态归类。举个(前端)列子:实现一个具备多选、删除、全选的列表。页面按钮:返回、关闭、多选、全选、item 选择、删除。可以想想怎么设计合理。

1 、设计不够合理,需要重来 :不需要设计的面面俱到,KISS 原则。就是先把一个模块最核心的东西设计出来。剩余的字段和相对资深的同事、架构师去讨论。2 、设计方案性能不够高或者后期维护麻烦 :1 、性能不够高 :这个是需要基础架构、业务架构的支持 。比如支持容器的扩缩容、读写分离、多级缓存、数据一致性 、分库分表 、是否需要反范式、索引是否合理、是否有数据倾斜和热点问题 2 、后期维护麻烦 :多想 1-2 步即可,比如需要多加一个字段、多支持一种业务形态。3 、另外的同事来做的话,会有更好的抽象,更合理的分层 :1 、多去问,如果你来设计会怎么想。和你的对比下,慢慢积累经验,业务架构不可能一簇而就。4 、唯一推荐:DDIA 。仔细读 3 遍

不可能一步到位的,做个相对合理的 case 就行

首先你需要先从建模开始入手,合理的模型才能高效的驱动业务,然后模型的持久化,数据库只是一种选择,文件,redis ,远程 API 也可以是持久化的一部分,把适合数据库的部分拿出来,再来说数据库表设计,数据库表和模型实体之间并不是严格的一比一的关系,虽然很多时候是一比一。一般来说基本原则还是遵循 3NF 范式,但是在某些地方,根据模型和业务的实际情况,需要做一个些反范式的设计,比如某些在 3NF 范式下 JOIN 深度超过 2 层的地方,用冗余字段降低到 2NF 范式,某些模型实体比较大的,根据访问频次,可能会切分成几个表,比如用户,用户的登陆信息和用户的属性就需要切分成两个表来存储,如果有一些统计字段,也会单独用一个表来存,因为登陆信息一旦插入,几乎很少修改,而属性则因为运营关系经常有需求会修改加字段,这个时候分开表就不容易被卡住。有用户的统计字段的话,因为经常性的更新统计信息,这个表比较热,所以更需要和其他几个表分开,这样保证了 1 ,模型的完整性 2 ,可扩展性 3 ,效率。做好设计后在纸上预跑一遍,不要依赖就急吼吼的拿起工具就建表,预跑一遍,把 SQL 写出来,然后才好规划索引,另外就是根据实际的业务来计算一下预计的容量,也是你系统的设计容量,比如有的表撑死了也就几百条一千吧条数据,那你除了主键外都没有必要建多余的索引。有的表预计记录条数超多,那么提前考虑好是否需要分表,分库。在真实世界里完美的设计是不存在的,因为其实完美的需求是不存在的,而好的设计和坏的设计的区别就在于如何取舍上,这个问题貌似没有哪本书能给你完美的答案。认识一个家伙特别喜欢买书,各类大作堆了一墙,但是能看完的,本就不多,看完了的,貌似也没啥用,搞数据库设计还是稀烂,经常扯到蛋(还是客户端的数据库)

既然你已经明确了另外的同事来做的话,会有更好的抽象,更合理的分层,你就去学习,思考别人为什么会这么做,这个过程比无脑看书更有意义。

先确定需求以及原型稿,然后根据需求确定功能结构图、信息结构图、业务流程图,照这些大概就能得出来一个概要设计了,然后跟产品或领导对齐细化,基本就可以开工了。 最重要是对齐,然后获取方案认可,不要闷头干。这就是最基本的流程,DDD 应该还太抽象了,如果你要看书那也有一本,最近我刚看的《软件设计:从专业到卓越》

非常赞同!

这个是我喜欢的答案

想得太多了

最终发现没有很好的方法论,都是经验,做多了业务就慢慢触类旁通了。没有办法很好地总结,如果有,不一早就有人分享出来了?为什么这这方面的资料这么少?

倒还不如问问看同事他是怎么做的。

遇到过和你一样的情况。我选择看了很多 UML 的书,什么火球 UML 大象 UML ,又看了 DDD 各种书,又看买了极客时间的各种 DDD 的课程,浪费了很多很多时间,但是收获很少,每天都很纠结,写不出来代码,需求甚至延期。最后恍然大悟,脱离了目标谈抽象,永无止境,永远有更好的抽象。最近我发现思考“公司的业务是怎么跑起来的,钱是怎么赚的”,比技术好玩儿多了~ 如果楼主有更好的资料,求分享一波,我还是想知道怎么才能设计出更好的东西

你比小白更加慎重,因为你见过一些坑,现在你在设计模型时会想办法避免这些坑。这就是个经验积累的过程,很正常。

看到楼主说是求术的,很遗憾,没有捷径,任何写代码三五年的人,看自己第一年的代码,都会像看屎一样。

DDD 当然值得借鉴,但更多的时候,从 0-1 设计会容易让项目陷入泥潭。我建议是在一种较成熟普遍,易于拓展和修改的设计上,先让代码落地,不断微调。大概可以叫渐进式设计 。理由就是我意识到自己的认知和能力有限,一下画不出一张大饼

终于从技术回归科学了

我觉得 27 楼的兄弟说的在理,设计出来好东西是不会凭空冒出来的,与其纠结怎样是好的,不如先快速试错,多迭代。世界的本质就是个草台班子,设计的再好抵不住人家早就把功能上线收客户钱了。

这东西还是需要些经验的。1. 很多时候设计的不好很大一部分是对业务需求理解不够。设计之前多花时间梳理业务,整理 use case ,画流程图,然后再分模块。 如果业务没理解好,后面的都白搭。 2. 好的系统不是设计出来的而是迭代出来的,特别是复杂的业务系统,很少有人能一开始就设计的很完善,大部分还是根据业务理解加深和新需求的变化,不断完善起来的。你同事能做好也是因为之前类似的经验,踩过坑了。这里你可以自己想过以后多和你同事讨论。重点是思考为什么自己一开始想不到这些点。3. 去 github 上搜你这个领域的代码,或者就是看公司好的项目代码,多思考为什么这么设计,特别是结合业务来看。 这本质是要提升你自己的思考问题的方式和角度,这个只能多想多练。 一些关于架构,DDD 之类的书,我建议有点自己的思考再看,你现在看了只会有个似是而非的印象,踩过坑之前,很难深刻理解那么做的意义。当然一些基础的设计概念的书籍如 clean code ,设计模式,重构这类的我默认是肯定读过的,否则完全没有理论基础单纯靠经验那也是扯谈,容易走成野路子。