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
cingular
V2EX  ›  MySQL

设计数据库结构时需要把前端需要的数据存入数据库吗?

  •  1
     
  •   cingular · 2018-08-05 12:49:15 +08:00 · 4114 次点击
    这是一个创建于 2302 天前的主题,其中的信息可能已经有所发展或是发生改变。
    抱歉 标题可能有些拗口,文科生自学的编程,举个例子来说:

    比如我写一个爬京东商品价格的程序,在设计数据库的时候建 2 个表:
    表 1 是商品属性(包括名称、分类、URL...),表 2 是价格属性(根据商品 id 对应的今日价格,以及下次变化的价格和时间),
    这样问题出来了,前端其实是需要找到表 2 中的某一商品价格的最低点及今日价,我想问的就是这个价格最低点一般是记录在数据表中还是前端调用的时候用再公式计算出来?

    1.记录在数据表中:
    这样每次抓取的时候同时需要更新最低价格这列数据,好处是前端可以直接引用值;
    2.随时计算:
    特点差不多与 1 相反;

    纠结一天了,多谢!
    9 条回复    2018-08-05 15:53:02 +08:00
    MangozZ
        1
    MangozZ  
       2018-08-05 12:56:09 +08:00
    那要先考虑一个场景。

    有没有比如查这个星期的最低价?最近 10 天的最低价? 最近季度的最低价?

    还是说单纯的固定查询 比如全历史最低价 和 每日最低价?

    这么说你不纠结了吧。。

    ps.不要相信产品说的话。
    cingular
        2
    cingular  
    OP
       2018-08-05 13:05:22 +08:00
    @MangozZ 谢谢,您的建议是只记录最基本的数据值,其他能通过计算得出的都不记录是吗,
    我其实很想知道专业的程序员们在设计数据库结构时候是怎么规划的,普遍是 1 还是 2,或者分情况 1、2 都有
    GoodRainChen
        3
    GoodRainChen  
       2018-08-05 13:09:18 +08:00
    @cingular 操作数据库的开销比较大,数据表更是不适合朝令夕改,所以一般只存一些比较固定的数据。
    那些需要计算的临时数据,如果有性能瓶颈,可以做缓存。极少会有需要存到数据库的情况。
    luob
        4
    luob  
       2018-08-05 13:15:00 +08:00
    直接 SELECT MIN(price)不行吗
    MangozZ
        5
    MangozZ  
       2018-08-05 13:28:53 +08:00
    @cingular 设计的时候 还是按照 2.随时计算 来设计。 因为筛选范围不固定,不可能记录的下各种情况。

    如果有我所说的固定查询,全历史最低价 和 每日最低价 等非常容易命中的范围, 则放在另一张的新建表。 以后可以随时抛弃该冗余表。

    ps.放我 mysql 一马吧。
    iannil
        6
    iannil  
       2018-08-05 13:30:51 +08:00   ❤️ 1
    1. 本着尽可能精简的原则设计,也就是能不存就不存。
    2. 根据产品需求、运营需要、商务策略、客户要求、技术复杂度等各种因素,综合评估确认需要冗余,再冗余。并且此时依然要考虑 1 里的描述。在效率和复杂度上把握平衡。

    有些情况冗余字段的效果很好,有些则没多大意义。

    例如简单的数学计算,递增递减,在每次数据变化时提前计算好结果放到冗余字段里,就比取出来一个再一个个算要合算。当然,也可以不冗余字段,客户端或前端显示时计算。但这样又会把业务逻辑放到前台,带来更新上的效率问题。

    又例如每次计算冗余结果时,本身就要对数据库进行查询,当数据稍微多一些或关联多一些,性能就会急速下降,这种就不合适冗余字段来处理,可以上缓存。如果确定冗余时查询的内容复杂度不会变多,比如固定 200 条或 300 条,更改架构添加缓存较为复杂,那又可以冗余字段来处理。

    总之,这是很依赖实际情况的,项目不同,技术选型不同,人也不同,做的选择和倾向性也会不同。
    个人观点,供参考。

    @cingular #2
    cingular
        7
    cingular  
    OP
       2018-08-05 13:50:09 +08:00
    明白了,感谢各位!
    lihongjie0209
        8
    lihongjie0209  
       2018-08-05 14:42:05 +08:00
    前端页面改版难不成你也要跟着改???
    BQsummer
        9
    BQsummer  
       2018-08-05 15:53:02 +08:00 via Android
    1,2 情况都有,1 情况相当于缓存,特别是改动不大、统计比较费时费资源情况下,选 1。你举得这个例子完全没必要去存,实时计算很方便。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2666 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 11:45 · PVG 19:45 · LAX 03:45 · JFK 06:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.