V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
gdb
V2EX  ›  MySQL

请问谁能推荐一个数据库建表的设计工具,类似于 GUI 的那种,表和表之间会自动加一些箭头

  •  1
     
  •   gdb · 2023-08-13 12:07:01 +08:00 · 4041 次点击
    这是一个创建于 453 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我最近打算使用 mysql 设计一个软件,数据库用来存放一些历史数据,需要设计一些数据库的表格。

    我在网上看到有一些工具,设计不同的表之后,表和表之间的外键连接会通过箭头连接的方式显示在 gui 界面里面。

    同时能生成 sql 的语句来创建这些表,请问有这样的工具么?在线的或者离线的都可以推荐,最好是免费可以使用的,谢谢!

    34 条回复    2023-08-14 19:40:53 +08:00
    teli
        1
    teli  
       2023-08-13 12:11:59 +08:00
    不建议添加外键
    ruochen666
        2
    ruochen666  
       2023-08-13 12:20:06 +08:00
    powerdesigner
    balancircle
        3
    balancircle  
       2023-08-13 13:02:03 +08:00
    wusheng0
        4
    wusheng0  
       2023-08-13 13:05:07 +08:00 via Android
    wusheng0
        5
    wusheng0  
       2023-08-13 13:05:53 +08:00 via Android
    taotaodaddy
        6
    taotaodaddy  
       2023-08-13 14:02:04 +08:00
    navicat 较新版本有带连线和箭头的设计工具
    565656
        7
    565656  
       2023-08-13 14:03:32 +08:00
    jb 全家桶里好像有个
    lujiaxing
        8
    lujiaxing  
       2023-08-13 14:43:58 +08:00
    PowerDesigner 就可以.
    你要是觉得 PD 比较古老你可以试试 Navicat. 也有这种功能.
    lujiaxing
        9
    lujiaxing  
       2023-08-13 14:44:12 +08:00
    @teli 为什么不建议
    loading
        10
    loading  
       2023-08-13 15:23:29 +08:00   ❤️ 1
    《为什么数据库不应该使用外键》

    https://draveness.me/whys-the-design-database-foreign-key/
    akira
        11
    akira  
       2023-08-13 15:54:47 +08:00
    外键,触发器这些东西,用的时候是爽了,出问题的时候,排查起来头大的要命
    gdb
        12
    gdb  
    OP
       2023-08-13 16:16:41 +08:00 via Android
    我是一个初学者,楼上好几个人都说不要使用外键,但我觉得很奇怪,如果不使用外键的话,这个关系型数据库如何进行表和表之间的关联呢?
    AEDaydreamer
        13
    AEDaydreamer  
       2023-08-13 16:24:17 +08:00
    用逻辑外键,非物理外键。
    Chad0000
        14
    Chad0000  
       2023-08-13 16:38:13 +08:00 via iPhone
    @gdb
    数据库知道地越少,压力就越小。

    表之间没有关联会阻止你关联查询数据么?
    charlie21
        15
    charlie21  
       2023-08-13 16:42:32 +08:00 via iPhone
    外键、索引、约束 ( constraint ,删掉一行数据时候会提示无法删除因为有约束存在),三者关系是什么?

    如果一个约束是为了在 “误删”数据之时丢出报错,那么在无外键的情况下还有一个约束吗?
    loading
        16
    loading  
       2023-08-13 16:56:35 +08:00
    @charlie21 #15 现在都是逻辑删除,不是真删除。
    逻辑删除无论是性能还是防误操作,都更优。

    逻辑删除一般就是有个 delete_time 一类的字段默认 null ,not null 就是已经删除了。
    iseki
        17
    iseki  
       2023-08-13 17:14:22 +08:00   ❤️ 2
    @loading 阅读了下这篇文章,结论基本可以从不使用外键修改为不使用 MySQL 。
    至于文章中讨论的,数据删除导致大量写入,这就是需求本身所要求的,无论你用不用外键,数据删除是一定要删的。
    至于 #16 提及的,所谓软删除,是彻彻底底的反模式,基本可以视为概念不清导致的混乱设计,可以查看[这个链接]( https://twitter.com/haoel/status/1440633425279389707)。

    @gdb 你需要的是 ERD 软件,Navicat 和 MySQL 自带的 MySQL Workbench 可以满足这个需求
    iseki
        18
    iseki  
       2023-08-13 17:15:05 +08:00
    loading
        19
    loading  
       2023-08-13 17:26:22 +08:00
    @iseki #17 数据库传统模式和现在的访问量需求和读写差异问题几乎是矛盾的,特别是范式。

    软删除很多时候不是防止误删除,还有其他产品上某些功能和体验上的需求,不只从 DB 方面考虑了。
    iseki
        20
    iseki  
       2023-08-13 17:31:25 +08:00   ❤️ 3
    @loading 链接中有讲到,如果产品和功能上有要求,那显然就不该是简单的删除。该是什么就叫什么,是隐藏就是隐藏,是禁用就是禁用,而不是一个笼统的删除。

    @loading 这里我不愿意提及 MySQL 的各种问题。单论你说的外键导致的级联删除,这一点不是不用外键就可以规避的。
    此外,数据库的外键可以极大程度保证数据的一致性。我所见很多程序员,高喊着不用外键,然后写出完全不考虑异常状态下一致性和完整性的代码,不一定是他们不愿意考虑,也有时是他们想不明白。这种情况下,数据库的实现要远远比应用自己实现的更可靠,成本更低。
    iseki
        21
    iseki  
       2023-08-13 17:32:38 +08:00
    至于针对性能的讨论,这个可能就要 case by case 地分析和论证了
    Rache1
        22
    Rache1  
       2023-08-13 17:52:44 +08:00
    Jetbrains 的 DataGrip 生成的图会自动考虑你表名(复数、单数)和字段名之间的关系,来生成 “箭头”,不依赖外键。

    比如:

    users 表有用户 id ,posts 表有 user_id ,那就会自动把 posts 表和 users 表关联起来。

    再比如,categories 表和 products 表有一个关系表,分别有 category_id 和 product_id ,DataGrip 也能帮你自动连起来。

    也就是说,只要你表名称是复数的,字段名字是单数 + id 的形式,他就可以自动推断出来。
    isbase
        23
    isbase  
       2023-08-13 21:44:12 +08:00 via iPhone
    @Rache1 表名单数也可以
    leonshaw
        24
    leonshaw  
       2023-08-14 00:46:42 +08:00
    @gdb 大胆用,做个简单的软件用数据库存点数据,什么性能不性能的,怎么方便怎么来。
    qsnow6
        25
    qsnow6  
       2023-08-14 01:16:39 +08:00
    用就完事,国外的社区主流的观点都是应用尽用。
    不然搞 ORM 搞啥。
    a33291
        26
    a33291  
       2023-08-14 08:51:16 +08:00
    曾经有一个项目必须走边界摆渡数据到内网,然后边界摆渡时,如果有外键则经常导致数据错乱,没办法只能删掉外键🤣
    kinXdle
        27
    kinXdle  
       2023-08-14 09:13:34 +08:00
    不用外键是因为没有 dba 啊
    cyrivlclth
        28
    cyrivlclth  
       2023-08-14 09:45:20 +08:00 via iPhone
    没想到外键警察也出现了....都魔怔了
    cyrivlclth
        29
    cyrivlclth  
       2023-08-14 09:50:56 +08:00 via iPhone
    我喜欢用 plantuml 来画 如果不想折腾 navicat 之类的 当然记得导出的时候去除外键
    YinHeWL
        30
    YinHeWL  
       2023-08-14 09:52:31 +08:00
    用 MySQL 不用外键的,真令人无语
    manasheep
        31
    manasheep  
       2023-08-14 10:17:56 +08:00
    @teli
    @akira
    @Chad0000
    那是不是直接用非关系数据库更好~
    lzgshsj
        32
    lzgshsj  
       2023-08-14 12:00:01 +08:00
    PlanetScale 直接就是明确不支持外键的,在这篇文章有提到原因 https://planetscale.com/docs/learn/operating-without-foreign-key-constraints
    sorcerer
        33
    sorcerer  
       2023-08-14 18:19:32 +08:00 via Android
    pdman
    gdb
        34
    gdb  
    OP
       2023-08-14 19:40:53 +08:00
    各位楼上的,你们说的 pdman 是国产软件,是这个么?现在似乎改名为 pdmaner 了?
    PDManer Releases - Gitee — https://gitee.com/robergroup/pdmaner/releases
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2892 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:08 · PVG 19:08 · LAX 03:08 · JFK 06:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.