这个架构有什么不好的?

时间:2015-03-10 17:18:15

标签: mysql database schema convention

我创建了一些将用于路由器活动报告的表。

每个表都是路由器api命令的一对一副本。 我的问题是,从设计和会议的角度来看,这些表有什么不好之处?关于它应该改变什么以及我做错了什么? 我知道它是扁平的,没有标准化,但除此之外。

以下是创建语句:

CREATE TABLE `Hotspot_UserActivity` (
  `Id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `HotspotNameId` varchar(100) DEFAULT NULL,
  `Server` varchar(100) DEFAULT NULL,
  `User` varchar(50) DEFAULT NULL,
  `Address` varchar(20) DEFAULT NULL,
  `MacAddress` int(50) DEFAULT NULL,
  `Uptime` varchar(100) DEFAULT NULL,
  `SessionTimeLeft` varchar(20) DEFAULT NULL,
  `IdleTime` varchar(20) DEFAULT NULL,
  `ByteIn` int(50) DEFAULT NULL,
  `ByteOut` int(50) DEFAULT NULL,
  `PacketIn` int(20) DEFAULT NULL,
  `PacketOut` int(20) DEFAULT NULL,
  `TimeCreated` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE
 CURRENT_TIMESTAMP,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

# Dump of table interface
# ------------------------------------------------------------

CREATE TABLE `interface` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `type` varchar(20) DEFAULT NULL,
  `mtu` int(32) DEFAULT NULL,
  `l2mtu` int(32) DEFAULT NULL,
  `max_l2mtu` int(32) DEFAULT NULL,
  `mac_address` varchar(32) DEFAULT NULL,
  `tx_byte` int(24) DEFAULT NULL,
  `rx_byte` int(24) DEFAULT NULL,
  `tx_packet` int(16) DEFAULT NULL,
  `rx_packet` int(16) DEFAULT NULL,
  `rx_drop` int(16) DEFAULT NULL,
  `tx_drop` int(16) DEFAULT NULL,
  `rx_error` int(16) DEFAULT NULL,
  `tx_error` int(16) DEFAULT NULL,
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


# Dump of table host_activity
# ------------------------------------------------------------
CREATE TABLE `host_activity` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `mac_address` varchar(20) DEFAULT NULL,
  `address` varchar(20) DEFAULT NULL,
  `server` varchar(20) DEFAULT NULL,
  `uptime` varchar(20) DEFAULT NULL,
  `idle_time` varchar(20) DEFAULT NULL,
  `bytes_in` int(20) DEFAULT NULL,
  `bytes_out` int(20) DEFAULT NULL,
  `packets_in` int(20) DEFAULT NULL,
  `packets_out` int(20) DEFAULT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



# Dump of table Hotspot
# ------------------------------------------------------------
CREATE TABLE `Hotspot` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `HotspotName` varchar(11) DEFAULT NULL,
  `Interface` varchar(11) DEFAULT NULL,
  `Profile` varchar(11) DEFAULT NULL,
  `IdleTimeOut` varchar(11) DEFAULT NULL,
  `KeepAliveTimeOut` varchar(11) DEFAULT NULL,
  `ProxyStatus` varchar(11) DEFAULT NULL,
  `Invalid` varchar(11) DEFAULT NULL,
  `Https` varchar(11) DEFAULT NULL,
  `Disabled` varchar(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


# Dump of table system_health
# ------------------------------------------------------------
CREATE TABLE `system_health` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `temperature` int(11) DEFAULT NULL,
  `cpuTemperature` int(11) DEFAULT NULL,
  `powerConsumption` int(11) DEFAULT NULL,
  `voltage` int(11) DEFAULT NULL,
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


# Dump of table system_resource
# ------------------------------------------------------------
CREATE TABLE `system_resource` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `uptime` varchar(50) DEFAULT NULL,
  `free_memory` int(50) DEFAULT NULL,
  `total_memory` int(50) DEFAULT NULL,
  `cpu_count` int(50) DEFAULT NULL,
  `cpu_frequency` int(50) DEFAULT NULL,
  `cpu_load` int(50) DEFAULT NULL,
  `free_hdd_space` int(50) DEFAULT NULL,
  `total_hdd_space` int(50) DEFAULT NULL,
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

# Dump of table user_activity
# ------------------------------------------------------------
CREATE TABLE `user_activity` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `uptime` int(11) DEFAULT NULL,
  `bytes_in` int(11) DEFAULT NULL,
  `bytes_out` int(11) DEFAULT NULL,
  `packets_in` int(11) DEFAULT NULL,
  `packets_out` int(11) DEFAULT NULL,
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

1 个答案:

答案 0 :(得分:0)

坏事:

  • 您正在将StudlyCasesnake_case混合在字段名称
  • 您不使用主键链接表格(例如Hotspot_UserActivity包含用户名,而不是他的ID)
  • 表格上没有索引
  • 您正在使用latin1字符集,它将使所有unicode消失
  • 你的表可能有过多的代理主键(你确定你不能为system_health表选择一个好的主键吗?可能你可以用某种方式编码一段时间或使用(HotspotNameId,{ {1}},user_id / TimeCreated)作为PeriodId
  • 中的主键
  • 您允许太多字段为空。这真的有必要吗?你的桌子稀疏吗?
  • 您的某些数据库字段可能选择的类型很差。例如,我非常确定4字节Hotspot_UserActivity足以表示int。为什么VARCHAR在那里?
  • 您违反了自己的命名惯例。例如,您的Uptime字段包含TimeCreated子句。那个怎么样?这是ON UPDATE CURRENT_TIMESTAMP字段,而不是created_at