请教一个Mysql表模型垂直数据库查询问题
目前应为需求的原因,导致我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;
};
生成的模型结构如图所示:
这是我实现的sql语句:
真的是有点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