V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
refresh
V2EX  ›  问与答

有很多字段数量不一的表怎么处理

  •  
  •   refresh · 2015-04-26 22:01:59 +08:00 · 2689 次点击
    这是一个创建于 3284 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个产品有很多型号,但不同产品型号是不一样的,但希望型号可查可分组。目前的想法是为每个产品都建一个表,新增加一个产品就建一个表。

    现在问题:

    1. 这样一个产品一个表好吗,有没有其它好办法
    2. 与产品表等其它表同在一个库好还是分库好,分库感觉不好查询,比如说要连接查询不太好;如果在同一个库,这个库的表会非常多。


    求建议,太高大上的解决方案就不要了,小项目。
    第 1 条附言  ·  2015-04-26 23:12:24 +08:00
    说明一下,数据库是mysql,每个产品会有不同数量的字段,每个字段的数据类型也可能不一样。其实有点类似于淘宝的商品库,每个商品有不同的属性,但要示属性可查可分组
    如果为每个产品都建表的话,那么表可能会非常多,达到1000+
    如果放到一个表里的话,那么查询分组的问题比较难解决

    换数据库的建议就不要了,因为不可能。
    第 2 条附言  ·  2015-04-27 18:50:13 +08:00
    业务大概是这样的:
    产品表,这个很稳定,没有问题
    型号表,一个产品每有很多型号,每个产品的型号字段也不一样,类似于产品属性。一个产品会有从数百到上万的型号,所有产品加起来,估计会上百万的型号。
    现在要求型号可以like查询可以分组,可以按数值区间查询,所以还需要做索引,要不查询效率没法看。

    另想问一下,一个库里有一千张表,会不会影响效率,会带来什么坑
    16 条回复    2015-04-27 18:47:07 +08:00
    hinate
        1
    hinate  
       2015-04-26 22:09:38 +08:00   ❤️ 1
    我认为可以一个表 类似 省市县 这样的
    refresh
        2
    refresh  
    OP
       2015-04-26 22:12:02 +08:00
    @hinate 和省市县有什么关系?
    refresh
        3
    refresh  
    OP
       2015-04-26 22:13:15 +08:00
    没说清楚,每个产品的字段数量是不一样的
    zado
        4
    zado  
       2015-04-26 22:22:05 +08:00   ❤️ 1
    做一个表就可以了,把所有可能用到的字段都加上去.然后再增加一个字段,用于标记这个产品的可用字段.
    maikcn
        5
    maikcn  
       2015-04-26 22:29:41 +08:00   ❤️ 1
    pgsql,型号之间通用的就用字段区分出来,特有的属性保存成json格式
    refresh
        6
    refresh  
    OP
       2015-04-26 22:56:50 +08:00
    @zado 如何查询分组,你的意思是做一个最大字段的表么,这种方式考虑过,但觉得好像不太好,字段类型不一样,有些需要建索引有些不需要。


    @maikcn 现在只考虑mysql,pgsql这样可查询么
    Comdex
        7
    Comdex  
       2015-04-26 22:59:14 +08:00
    mongodb?
    zado
        8
    zado  
       2015-04-26 23:18:02 +08:00
    可以再添加一个字段记录分组信息.

    我的意思是做一个很多字段的表,字段类型不一样当然就要分开建字段了,每个产品都选择性的填写自己需要的字段,不需要的就留空.

    产品数量有多少啊?不多就不用建索引,就算必须建索引,一个表也是可以建立多个索引的啊.
    refresh
        9
    refresh  
    OP
       2015-04-26 23:39:46 +08:00
    @zado 你这个也是一种解决方案,但我觉得业务逻辑将会非常复杂,索引也不好建。比如说总共有5种数据类型,然后每种类型建20个字段,再用一个表标记,万一哪天某个产品属性突然多了,就麻烦了。

    数量量比较大,估计有上百万条记录
    yangqi
        10
    yangqi  
       2015-04-27 00:15:38 +08:00   ❤️ 2
    参考wordpress的方法,id-属性-值,表里只要这三个字段,这样每个商品可以有任意无限个属性

    这种方法比较灵活,但是牺牲一点性能,可以在别的地方优化
    maikcn
        11
    maikcn  
       2015-04-27 00:33:32 +08:00   ❤️ 1
    @refresh pgsql 的 json 格式内的内容是支持直接查询的,不过不考虑换数据库的话 mysql 要到 5.7 的版本才原生支持 json,或者 #10 楼的也是一个办法
    FrankFang128
        12
    FrankFang128  
       2015-04-27 00:41:42 +08:00 via Android   ❤️ 1
    类型不同的数据怎么能在一个表里
    zado
        13
    zado  
       2015-04-27 08:29:18 +08:00   ❤️ 1
    @refresh 没有想到产品信息表会有这么大,这样设计是效率很低的.
    wy315700
        14
    wy315700  
       2015-04-27 08:34:48 +08:00   ❤️ 1
    mongodb
    hdshen
        15
    hdshen  
       2015-04-27 12:43:07 +08:00   ❤️ 1
    如果只用mysql 可以把每个产品 必有的 通用的字段 设计成一个表

    表里 额外计算添加一个分组或者 对应的详细 分表

    详细分表可以创建多个 按照类型算吧 id 属性 值

    缺点是对属性的查询性能可能不够理想


    其实mongodb是最好的解决方案
    refresh
        16
    refresh  
    OP
       2015-04-27 18:47:07 +08:00
    @yangqi 小量数据的话,wordpress的方式没有问题,但如果上百万的数据,wp的方式不行

    @maikcn 现在转数据库不可能了

    @hdshen mongodb在这方面是适合,但业务系统估计比较麻烦,坑也比较多。一个表业务处理会比较复杂,多个表的话,会有很多表,想想一个库里有1000+的表好蛋疼
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5789 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 06:06 · PVG 14:06 · LAX 23:06 · JFK 02:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.