数据库设计太拉跨被喷了。

2021-04-23 14:19:14 +08:00
 Renco

发现都是些智障问题,总结一下。

目前统计下来应该都是类似的问题。我数据库设计确实拉跨,可能是因为之前做的东西过度松散,对于数据库设计基本都是能用就行,关联表的约束关系可能都没有做全,全靠代码来做。还有很多细节上的问题。其实每次开发都是很快很简单,但是表设计真的让我头大。

11518 次点击
所在节点    程序员
71 条回复
Renco
2021-04-23 15:01:21 +08:00
@xuanbg 了解
kamal
2021-04-23 15:07:34 +08:00
本来有收藏数据库设计的文章,但是传送门关站以后,收藏的就是个死链接了……
Rwing
2021-04-23 15:09:42 +08:00
@Renco 笑哭,这是哪个智障定的规范
Renco
2021-04-23 15:11:20 +08:00
@kamal 可惜,数据库设计一直是我的痛
nine
2021-04-23 15:12:59 +08:00
用 Ruby on Rails 的标准规范就行了。
https://ruby-china.github.io/rails-guides/active_record_basics.html
huifer
2021-04-23 15:13:03 +08:00
创建人 ID,修改人 ID,创建时间,修改时间,删除标记位(不需要的就不加)常规都加,表字段常用的和非常用的分开设计_core(核心),_extends (拓展)
xiaochun41
2021-04-23 15:14:44 +08:00
库表设计方面的话题太大了,不过基本上可以从这几个方面考虑:
1. 字段命名,
2. 字段类型的选择
3. 数据模型的设计(业务对象如何存,存几张表,如何冗余)
4. 业务对象关联关系的设计(业务对象的关系怎么存等)
5. 索引的设计
6. 存储引擎的选择
7. 库表容量的规划(数据规模多大,增长趋势如何,是否考虑分库分表)
8. 团队的规范
9. 行业最佳实践

暂时想到这些
young
2021-04-23 15:17:04 +08:00
数据库中一直有一个建表的模板, id, create_at, create_by, update_at, update_by, delete_at, delete_by, is_deleted
随用随取
5G
2021-04-23 15:19:17 +08:00
看下阿里的 mysql 规范文档呗
QlanQ
2021-04-23 15:20:11 +08:00
虽然我也比较拉跨,但是我真的 lz 比我还 拉跨
lst_name 我也想到应该是 last_name 但是我不敢肯定,不知道为啥会这样设计,少一个 a 有啥用?
只存 name 不存 id 我也不懂是干啥的,如果有重名怎么办,如果不光需要知道 对方的名字还需要其他的信息怎么办?用中文关联吗?
肯定是先关联 ID 然后在考虑要不要保存 name
约束,很多都说 不要做,特别是外键约束,会影响性能
实在不知道怎么弄好的时候,就 看看 框架默认的是什么,比如 laravel 的框架 时间默认都是 created_at updated_at deleted_at
关联都是 表名单数_id
ksedz
2021-04-23 15:21:41 +08:00
先画 ER 图,再生成表

很多时候没有标准答案的,比如你说的存 id 这事,如果要尽量简单无冗余,就只存 id,提高性能简化查询就顺手缓存 name,而一些场景考虑到 name 可能变化甚至删除,你需要知道这里是要修改时的 name 还是最新的 name 。这不是能轻易判断对错的问题,全看对业务需求的理解了。
Vegetable
2021-04-23 15:29:13 +08:00
平时多看,自己设计的时候,多换位思考,多反思,每个人都有自己的风格,无可厚非,但是看得多了,就知道什么样的设计是好的,什么样的是差的。
no1xsyzy
2021-04-23 15:44:42 +08:00
creation_subject_id
creation_subject_user_name
creation_complete_time

首先,如果是 canonical complete 的关系型表设计,不应当是一个条目里存储创建者
而应当是记录创建的发生,其主体与客体与完成时间(参考是)。
就你提到的设计来说,item.creator_id 实质上是 creation.subject_id ON creation.object_id=item.id 的嵌入,[id] 相消,应当是 creation_subject_id
我认为应当写成 嵌入表名称 "_" 嵌入表字段名
同理,item.creator_name 其实是 user.name ON user.id=item.creation_subject_id 的嵌入,[id] 相消,所以剩下的是 creation_subject_user_name
Renco
2021-04-23 15:51:20 +08:00
@QlanQ 是这块设计确实没有过脑子嗨,在反省了
NULL2020
2021-04-23 15:59:58 +08:00
1. 关联的字段肯定是用主键 id 啊,一个表的字段除了主键 id,其它都是有可能会变的。

2. 常用的约束一般就是非空和唯一性两个。

3. create_by update_by create_time/create_at update_time/update_at

4. 布尔型的习惯用 xxx_flag,如软删除标记 delete_flag
no1xsyzy
2021-04-23 16:00:55 +08:00
完全可以推算出最恰当的组织形式,为什么要自己拍脑袋做转换?

https://gist.github.com/no1xsyzy/5391a79203b0ee64aec7c7de46b028f2
edk24
2021-04-23 16:03:32 +08:00
@leonme 阿里 Java 手册
xhldtc
2021-04-23 16:14:12 +08:00
buster
2021-04-23 16:31:23 +08:00
难道只有我一个人,第一版数据设计总是不完善,做着做着就改呗。
jones2000
2021-04-23 16:35:48 +08:00
请专业的 DBA 设计, 否则后续肯定还要重新设计。

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

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

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

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

© 2021 V2EX