请教一个Mysql表模型垂直数据库查询问题
发布于 2 年前 作者 zhang962976642 1557 次浏览 来自 问答

目前应为需求的原因,导致我server_node表中存储的其他表关联表的id信息的字段,可能不是一个id信息,可能是多个。 由于是垂直数据库存在数据冗余,然而我这个接口需要分页功能,但是会把同一个server_node_id的数据都查出来,我现在想把server_node_id值相等的字段合并成一条数据,功能是实现了,但是sql语句我写的太low了,请教下Cnodejs的大佬指点下。 当前如果有更好的表模型设计方法,请大佬指点我一下。 mysql 模型如下。

module.exports = function(sequelize, DataTypes){
  const Server_Node = sequelize.define('server_node', {
   id: {
      field: 'id',                                    // 别名
      type: DataTypes.BIGINT,                         // 类型
      allowNull: true,
      unique: true,                                   // 是否是唯一值
      comment: 'server_node服务器节点管理表,id字段',   // 简介说明
      primaryKey: true,                               // 是否为主键
      autoIncrement: true                             // 是否为自增长
    },
    by_server_box: {
      field: 'by_server_box',
      type: DataTypes.INTEGER,
      allowNull: false,
      comment: 'server_node服务器节点所属的服务器容器id信息'
    },
    server_node_id: {
      field: 'server_node_id',
      type: DataTypes.STRING,
      allowNull: false,
      
      comment: 'server_node_id服务器节点编号信息'
    },
    server_usage: {
      field: 'server_usage',
      type: DataTypes.INTEGER,
      allowNull: false,
      comment: 'server_node服务器节点管理表,服务器节点用途'
    },
    mark: {
      field: 'mark',
      type: DataTypes.BOOLEAN,
      allowNull: false,
      defaultValue: 0,
      comment: 'server_node服务器节点管理表,服务器节点状态 约定 0为未的分配、1为已分配未使用、2为已分配已使用'
    },
    has_cpu: {
      field: 'has_cpu',
      type: DataTypes.INTEGER,
      comment: 'server_node服务器节点管理表, 这里存储配置好的cpu配置信息'
    },
    has_memory: {
      field: 'has_memory',
      type: DataTypes.INTEGER,
      comment: 'server_node服务器节点管理表, 这里存储内存条型号'
    },
    has_hard_disk: {
      field: 'has_hard_disk',
      type: DataTypes.INTEGER,
      comment: 'server_node服务器节点管理表, 这里存储硬盘类型'
    },
    bandwidth: {
      field: 'bandwidth',
      type: DataTypes.INTEGER,
      comment: 'server_node服务器节点管理表,这里存储服务器带宽值'
    },
    network: {
      field: 'network',
      type: DataTypes.INTEGER,
      comment: 'server_node服务器节点网卡信息'
    },
    by_switchboard_node: {
      field: 'by_switchboard_node',
      type: DataTypes.INTEGER,
      allowNull: false,
      defaultValue: 1,
      comment: 'server_ndoe服务器节点管理表,存储网卡节点所用的交换机接口,默认为1个交换机接口'
    },
    by_ip_room: {
      field: 'by_ip_room',
      type: DataTypes.INTEGER,
      allowNull: false,
      comment: 'server_node服务器节点管理表,节点ip地址所属的机房信息'
    },
    by_ip_cabinet: {
      field: 'by_ip_cabinet',
      type: DataTypes.INTEGER,
      comment: 'server_node服务器节点管理表,节点ip地址所属的机柜信息'
    },
    ip_address: {
      field: 'ip_address',
      type: DataTypes.INTEGER,
      comment: 'server_node服务器节点管理表,节点ip地址'
    },
    manage_address: {
      field: 'manage_address',
      type: DataTypes.STRING,
      comment: 'server_node服务器节点管理表,节点的管理地址'
    },
    desc: {
      field: 'desc',
      type: DataTypes.STRING,
      comment: 'server_node服务器节点管理表,节点的备注信息'
    },
    maintenance: {
      field: 'maintenance',
      type: DataTypes.INTEGER,
      comment: 'server_node服务器节点管理表, 节点维护日志'
    },
    createTime: {
      field: 'createTime',
      type: DataTypes.DATE,
      allowNull: false,
      defaultValue: DataTypes.NOW,
      comment: '服务器节点创建的时间.'
    },
    putShelfTime: {
      field: 'putShelfTime',
      type: DataTypes.DATE,
      comment: '服务器节点上架的时间.'
    },
    pullShelfTime: {
      field: 'pullShelfTime',
      type: DataTypes.DATE,
      comment: '服务器节点下架的时间.'
    },
    renewTime: {
      field: 'renewTime',
      type: DataTypes.DATE,
      comment: '服务器节点续费的时间.'
    },
    table_mark: {
      field: 'table_mark',
      type: DataTypes.BOOLEAN,
      defaultValue: true,
      allowNull: false,
      comment: '表模块状态,默认为true启用状态'
    },
    table_comment: {
      field: 'table_comment',
      type: DataTypes.STRING(1234),
      defaultValue: '服务器节点表,用来存数服务器节点信息、服务器节点状态、服务器节点所使用的交换机接点信息等。',
      allowNull: false,
      comment: '表模型的默认描述信息'
    }  
  },
  {
    tableName: 'server_node',
    freezeTableName: true,
    timestamps: true,
    underscored: true
  });
  Server_Node.associate = function(models){
    /* 服务器节点表属于服务器容器表
    服务器节点包含服务器维护日志模型
    服务器节点包含服务器用途表模型
    服务器节点表包含网卡信息表模型
    服务器节点包含cpu表模型
    服务器节点包含内存条表模型
    服务器节点包含硬盘表模型
    服务器节点包含ip地址表模型
    服务器节点包含交换机节点表模型 */

    // 服务器节点属于服务器容器表
    Server_Node.belongsTo(models['server_box'], {
      foreignKey: 'id',
      constraints: false 
    });
    // 服务器节点包含服务器日志
    Server_Node.hasMany(models['server_maintenance'], {
      foreignKey: 'by_server_node',
      constraints: false
    });
    // 服务器节点包含服务器用途模型关系
    Server_Node.hasMany(models['server_usage'], {
      foreignKey: 'usage',
      constraints: false
    });
    Server_Node.hasMany(models['network_node'], {
      foreignKey: 'switchboard_node',
      constraints: false
    });
    // 服务器节点包含服务器cpu表模型关系
    Server_Node.hasMany(models['cpu'], {
      foreignKey: 'cpu_id',
      constraints: false
    });
    // 服务器节点包含服务器内存条模型关系
    Server_Node.hasMany(models['memory'], {
      foreignKey: 'memory_id',
      constraints: false
    });
    // 服务器节点包含服务器硬盘模型关系
    Server_Node.hasMany(models['hard_disk'], {
      foreignKey: 'hard_disk_id',
      constraints: false
    });
    // 服务器节点包含ip地址表模型
    Server_Node.hasMany(models['ip'], {
      foreignKey: 'u_ip',
      constraints: false
    });
    // 服务器节点包含交换机节点模型信息
    Server_Node.hasMany(models['switchboard_node'], {
      foreignKey: 'switchboard_node_id',
      constraints: false
    });
  };
  return Server_Node;
};

生成的模型结构如图所示:
image.png
这是我实现的sql语句:
image.png
真的是有点low,请大佬指点。

	SELECT by_server_box,
         GROUP_CONCAT(DISTINCT server_node_id) AS server_node_id,
         GROUP_CONCAT(DISTINCT server_usage) AS server_usage,
         GROUP_CONCAT(DISTINCT mark) AS mark,
         GROUP_CONCAT(DISTINCT has_cpu) AS has_cpu ,
         GROUP_CONCAT(DISTINCT has_memory) AS has_memory,
         GROUP_CONCAT(DISTINCT has_hard_disk) AS has_hard_disk,
         GROUP_CONCAT(DISTINCT bandwidth) AS bandwidth,
         GROUP_CONCAT(DISTINCT network) AS network,
         GROUP_CONCAT(DISTINCT by_switchboard_node) AS by_switchboard_node ,
         GROUP_CONCAT(DISTINCT by_ip_room) AS by_ip_room,
         GROUP_CONCAT(DISTINCT by_ip_cabinet) AS by_ip_cabinet,
         GROUP_CONCAT(DISTINCT ip_address) AS ip_address,
         GROUP_CONCAT(DISTINCT manage_address) AS manage_address,
         GROUP_CONCAT(DISTINCT `desc`) AS `desc` ,
         GROUP_CONCAT(DISTINCT maintenance) AS maintenance
	FROM server_node
	GROUP BY  by_server_box;

再写谢谢诸位大佬!
by: 2017/09/07 16:47

1 回复

求救啊,Help me

回到顶部