V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
noobma
V2EX  ›  程序员

大佬们,我这个表该怎么设计

  •  
  •   noobma · 2019-12-30 22:02:06 +08:00 · 2933 次点击
    这是一个创建于 1819 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有些数据需要在后台配置,比如视频、文章、图片等,所以也就有 video、article、picture 这些表,现在要搞一个预览功能,也就是数据配置完成后,先是配置人员预览确认没问题后,再点一下“发布”按钮,这样才会让用户看到新配置的数据。

    现在我想到 2 个方法:

    1. 给每个表加个 status 字段,值为 normal、preview、release,点“发布”按钮,先把每个表里面 release 的置为 normal,然后再把处于 preview 状态下的那一条置为 release。
    2. 专门弄个预览表来存预览状态的数据,preview_video、preview_article、preview_picture,点击“发布”的时候在把这些表里面的数据同步到 preview、article、picture。

    我觉得上面 2 种方法都不大行啊,点击一下“发布”按钮,要做好多操作,感觉容易出幺蛾子啊。

    求各位大佬指点下我这个赶鸭子上架的菜鸡,另外就是大佬们有没有常用的表设计范式的书,推荐一些,不胜感激🙏

    12 条回复    2019-12-31 00:07:53 +08:00
    lhx2008
        1
    lhx2008  
       2019-12-30 22:35:41 +08:00 via Android   ❤️ 1
    第一种吧
    wangyzj
        2
    wangyzj  
       2019-12-30 22:41:47 +08:00   ❤️ 1
    第一种适合小场景
    第二种适合大规模 cdn 场景
    iamwho
        3
    iamwho  
       2019-12-30 22:43:09 +08:00   ❤️ 1
    各个表加 draft 字段,需要权限才能看到,或为 0 显示。
    zhuzhibin
        4
    zhuzhibin  
       2019-12-30 22:58:40 +08:00 via iPhone   ❤️ 1
    听不太明白 如果仅仅是 release 版本 用户才可以浏览得到 那么就统一 state 去管理即可 类似你说的 A 方案 整个页面发布的流程就是
    预览->发布 管理 state 就好 后续复杂也可以补充回滚啥的
    xiaofan2
        5
    xiaofan2  
       2019-12-30 23:04:16 +08:00   ❤️ 1
    第二种没必要,你相当于插了两次相同数据
    avenger
        6
    avenger  
       2019-12-30 23:10:17 +08:00 via iPhone   ❤️ 1
    加个 flag 就好,参考 wordpress
    noobma
        7
    noobma  
    OP
       2019-12-30 23:11:40 +08:00
    谢谢各位大佬🙏,看来第 1 种方案结合上 #3 大佬说的限制权限比较合适
    Sunyanzi
        8
    Sunyanzi  
       2019-12-30 23:11:59 +08:00   ❤️ 1
    为什么我做的预览从来都没有涉及数据库的 ... 都只是用既定的模版渲染一遍用户输入的数据而已 ...

    换言之就是假装页面上展示的这些数据是从库里读出来的 ... 实际上都是前一页输入的还没入库 ...

    顶楼这个需求 ... 在我看来更像一个「待审核」的状态 ... 默认发布只有特定权限组可见 ... 后续才扩展可见性 ...

    那么这样毫无疑问是第一种解决方案 ... 也就是一个 status 字段的事情 ... 何必冗余表呢 ...
    noobma
        9
    noobma  
    OP
       2019-12-30 23:19:56 +08:00
    @Sunyanzi 主要是有些视频和图片需要传到 OSS 上面,如果不在服务器上存住状态的话,一刷新或者换个浏览器,我那个 OSS 上面的空间就被浪费了😅 已经打算采取第 1 种方式了
    jackrebel
        10
    jackrebel  
       2019-12-30 23:21:37 +08:00
    第一种就好, 第二种你一旦改了主要表的结构, 你这临时表也要跟着改。 要改的地方好多。
    yb3712590
        11
    yb3712590  
       2019-12-31 00:01:25 +08:00
    之前看 informatica 元数据的版本控制设计思路,供参考。
    对象表和模块表存在 visible、validated、version 和 last_save_timestamp 等字段。
    更新某个对象产生了新的版本,会在一张额外的验证表中留下对象 ID 和新的时间戳,对模块查看时,比对模块包含的每个对象的验证记录,时间戳落后则标记为失效模块,进而要求人工验证并刷新整个模块的版本,记录新的时间戳,此时版本最新且模块可用,但只对操作人可见,对应 preview。
    最后对有效模块版本的签入,标记 visible,对所有人可见,对应发布操作。
    mcfog
        12
    mcfog  
       2019-12-31 00:07:53 +08:00 via Android
    几乎任何情况下我都选第二种

    我就不信发布以后就没有修改的需求,有一个人预览就没有第二个人审核的需求

    编辑的时候可能是一个后台表对应一个编辑界面,复杂字段 json 揉一坨完事儿,发布到前台主站可能是三个表外加 es 上报
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2658 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:08 · PVG 23:08 · LAX 07:08 · JFK 10:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.