在许多关系数据库设计中,有些字段会在其他表中引用。
例如,考虑具有唯一用户名的用户表和存储地址数据的第二个表。
一种可能的布局,我会说是常见的方法,因为我在大多数软件中观察到,是使用这样的自动增量 id:
Table users
===========
userId int primary auto_increment
userName varchar unique
Table adressdata
==========
userId int references users.userId
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key on (userId,adress_type))
Run Code Online (Sandbox Code Playgroud)
这就是我过去常常这样做的方式,也是我在大多数情况下看到的方式。
另一种方法是:
Table users
===========
userName varchar primary
Table adressdata
==========
userName varchar references users.userName
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key …Run Code Online (Sandbox Code Playgroud) 我已经调试了很多,最后设法在 mysql shell 中重现它。
我将时间戳存储在字段类型为 的 mysql 数据库中timestamp。我用来FROM_UNIXTIME()从我的脚本中更新它们,并UNIX_TIMESTAMP()在选择它们时使用。
当我没有在使用SET time_zone =它的连接中设置时区时,它工作正常。但是当我设置时区时,会发生以下情况:
UNIX_TIMESTAMP() 仍然给出正确的结果。UPDATE table SET field = FROM_UNIXTIME(..) 在数据库中设置错误的值。我知道是 FROM_UNIXTIME() 不起作用,因为当我打开另一个没有连接特定时区的连接时,我看到错误的值,直到我再次更新它。
它是 1 小时的差异这一事实让我认为这可能是夏令时问题。因为柏林有夏令时而曼谷没有(据我所知)。
这是 mysql shell 的未修改日志,我在其中重现了此行为。
服务器时区是亚洲/曼谷(CIT)
$ mysql -uroot -p timezonetest
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with …Run Code Online (Sandbox Code Playgroud) 我目前正在运行一个 MySQL 数据库来记录和分析这些日志。
我当前的表架构如下所示:
CREATE TABLE `mylogs` (
`transfer_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`client_id` INT UNSIGNED NOT NULL ,
`client_ip` INT UNSIGNED NOT NULL ,
`server_1_ip` INT UNSIGNED NOT NULL ,
`server_2_ip` INT UNSIGNED NOT NULL ,
`service` ENUM( 'service1', 'service2', 'service3', '...', 'service500' ) NOT NULL ,
`mb_transferred` FLOAT UNSIGNED NOT NULL ,
`time` TIMESTAMP NOT NULL
) ENGINE = MYISAM ;
Run Code Online (Sandbox Code Playgroud)
我运行了一项服务,在那里我提供了大量下载,这些下载在目标和源主机之间通过 1 个额外的主机。它们由 32 位 IP 地址的整数解释表示。
我的系统目前在高峰时段处理大约 500 次插入/秒。我运行的是主从系统。主服务器有一个带有 PHP 文件的 apache …