工作一段时间后,业务设计和数据库设计反而难下手了,有没有好建议?

34 天前
 shinelamla

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

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

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

4139 次点击
所在节点    程序员
35 条回复
skyemin
34 天前
看看 DDD
Jack66
34 天前
从简入难,mvc 多看表设计
xiangxiangxiang
34 天前
@skyemin 麻烦问下有书籍推荐的吗?
yule111222
34 天前
《解构领域驱动设计》
《架构整洁之道》
《分析模式:可复用的对象模型》
morenacl
34 天前
逻辑、抽象、复用,思维体系三基石
shinelamla
34 天前
@morenacl 有没有具体的?
shinelamla
34 天前
@yule111222 像这种回答应该被推荐
afxcn
34 天前
理清楚业务之间的关系应该不是件难的事情,难以下手往往是想太多,过度设计。
securityCoding
34 天前
找准两三个开源项目彻底吃透
woodwhales
34 天前
可以先看现已上线的系统功能需求,想想自己来设计会怎么设计库表及代码结构。然后看现有代码怎么实现的,存在不合理和合理的,一目了然。
如果项目没有现成的已实现功能,可以列出自己的思路,找同事私下把把关,探讨一下。

最后再配合楼上说的书籍加深理解,上来就看书,太理论,个人觉得对新人不友好。
cstj0505
34 天前
如果不是交易系统那种一点不能错的我反而不重视数据库设计,包括三范式也不遵循,关系数据库里大量用到 json 字符串,外键也不用.
我觉得关系模型太繁琐了.
NessajCN
34 天前
https://www.mongodb.com/basics/database-architecture
你问的太宽泛了,那我也只好宽泛地说根据需要选 Tier1~3 的架构
至于具体选哪个 tier ,选好了之后怎么设计各个 layer ,得结合实际业务来
shinelamla
34 天前
@woodwhales 谢谢,挺好的建议
nothingistrue
34 天前
内练:《实现领域驱动设计》(Vaughn Vernon 著, 滕云 译) (要准备上几年慢慢练,不然容易走火入魔。)

外练:Entity Relation Diagram/Design/Modeling 。相关参考如下:
方法 https://www.cnblogs.com/muchen/p/5258197.html
关系的名称和方向
https://stackoverflow.com/questions/15941149/how-we-identify-the-relation-direction-in-an-er-diagram-if-we-use-chens-notation
陈氏表示法 https://vertabelo.com/blog/chen-erd-notation/
乌鸦脚表示法(多重性上一般不用原始陈氏表示法而换用乌鸦脚表示法) https://vertabelo.com/blog/crow-s-foot-notation/

请注意:不管是 DDD ,还是 ERD ,都不是单纯的技术设计,而是业务模型设计,产品/需求也是要参与的。如果产品/需求压根不管你啥模型,就盯着界面原型甚至效果图,还拒绝被模型引导,那你搞啥都不管用。
pkoukk
34 天前
我的理解是,数据和数据库是不同的,先理业务,理解你的数据流
让数据走通整个流程,当你做完这一切的时候
数据库只是最后保存的那一下,没什么难度了
ZhuWenJian
34 天前
业务设计可以用状态归类。
举个(前端)列子:实现一个具备多选、删除、全选的列表。
页面按钮:返回、关闭、多选、全选、item 选择、删除。
可以想想怎么设计合理。
tianzx
34 天前
1 、设计不够合理,需要重来 :不需要设计的面面俱到,KISS 原则。就是先把一个模块最核心的东西设计出来。剩余的字段和相对资深的同事、架构师去讨论。
2 、设计方案性能不够高或者后期维护麻烦 :1 、性能不够高 :这个是需要基础架构、业务架构的支持 。比如支持容器的扩缩容、读写分离、多级缓存、数据一致性 、分库分表 、是否需要反范式、索引是否合理、是否有数据倾斜和热点问题 2 、后期维护麻烦 :多想 1-2 步即可,比如需要多加一个字段、多支持一种业务形态。
3 、另外的同事来做的话,会有更好的抽象,更合理的分层 :1 、多去问,如果你来设计会怎么想。和你的对比下,慢慢积累经验,业务架构不可能一簇而就。
4 、唯一推荐:DDIA 。仔细读 3 遍
piecezzz
34 天前
不可能一步到位的,做个相对合理的 case 就行
niubee1
34 天前
首先你需要先从建模开始入手,合理的模型才能高效的驱动业务,然后模型的持久化,数据库只是一种选择,文件,redis ,远程 API 也可以是持久化的一部分,把适合数据库的部分拿出来,再来说数据库表设计,数据库表和模型实体之间并不是严格的一比一的关系,虽然很多时候是一比一。一般来说基本原则还是遵循 3NF 范式,但是在某些地方,根据模型和业务的实际情况,需要做一个些反范式的设计,比如某些在 3NF 范式下 JOIN 深度超过 2 层的地方,用冗余字段降低到 2NF 范式,某些模型实体比较大的,根据访问频次,可能会切分成几个表,比如用户,用户的登陆信息和用户的属性就需要切分成两个表来存储,如果有一些统计字段,也会单独用一个表来存,因为登陆信息一旦插入,几乎很少修改,而属性则因为运营关系经常有需求会修改加字段,这个时候分开表就不容易被卡住。有用户的统计字段的话,因为经常性的更新统计信息,这个表比较热,所以更需要和其他几个表分开,这样保证了 1 ,模型的完整性 2 ,可扩展性 3 ,效率。做好设计后在纸上预跑一遍,不要依赖就急吼吼的拿起工具就建表,预跑一遍,把 SQL 写出来,然后才好规划索引,另外就是根据实际的业务来计算一下预计的容量,也是你系统的设计容量,比如有的表撑死了也就几百条一千吧条数据,那你除了主键外都没有必要建多余的索引。有的表预计记录条数超多,那么提前考虑好是否需要分表,分库。

在真实世界里完美的设计是不存在的,因为其实完美的需求是不存在的,而好的设计和坏的设计的区别就在于如何取舍上,这个问题貌似没有哪本书能给你完美的答案。认识一个家伙特别喜欢买书,各类大作堆了一墙,但是能看完的,本就不多,看完了的,貌似也没啥用,搞数据库设计还是稀烂,经常扯到蛋(还是客户端的数据库)
yueyuea
34 天前
既然你已经明确了另外的同事来做的话,会有更好的抽象,更合理的分层,你就去学习,思考别人为什么会这么做,这个过程比无脑看书更有意义。

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

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

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

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

© 2021 V2EX