我正在为一个组织创建一个会员目录,并试图找出一种很好的方法来保持每个人的详细信息井井有条且可更新。我有 3 张桌子:
人员表处理实际人员
CREATE TABLE `person` (
`personid` BIGINT PRIMARY KEY AUTO_INCREMENT,
`personuuid` CHAR(32) NOT NULL,
`first_name` VARCHAR(50) DEFAULT '',
`middle_name` VARCHAR(50) DEFAULT '',
`last_name` VARCHAR(50) DEFAULT '',
`prefix` VARCHAR(32) DEFAULT '',
`suffix` VARCHAR(32) DEFAULT '',
`nickname` VARCHAR(50) DEFAULT '',
`username` VARCHAR(32) ,
`created_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`created_by` CHAR(33) DEFAULT '000000000000000000000000000000000',
`last_updated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`last_updated_by` CHAR(33) DEFAULT '000000000000000000000000000000000'
) ENGINE=InnoDB, COMMENT='people';
关于一个人的信息。例如学校、电话号码、电子邮件、推特名称等。所有这些值都将作为 json 存储在“值”中,我的程序将处理所有内容。在用户每次更新时,都会创建一个新条目以显示更改的转换。
CREATE TABLE `person_info` (
`person_infoid` BIGINT PRIMARY KEY AUTO_INCREMENT,
`person_infouuid` CHAR(32) NOT NULL,
`person_info_type` INT(4) NOT NULL DEFAULT 9999,
`value` TEXT,
`created_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`created_by` CHAR(33) DEFAULT '000000000000000000000000000000000',
`last_updated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`last_updated_by` CHAR(33) DEFAULT '000000000000000000000000000000000'
) ENGINE=InnoDB, COMMENT="Personal Details";
person 和 person_info 表之间的映射
CREATE TABLE `person_info_map` (
`personuuid` CHAR(32),
`person_infouuid` CHAR(32) ,
`created_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`created_by` CHAR(33) DEFAULT '000000000000000000000000000000000',
`is_active` INTEGER(1)
) ENGINE=InnoDB, COMMENT="Map between person and person info";
因此,鉴于person_info
每次有更新时我都会创建一个新条目,我想知道我是否应该担心 i/o 错误、表变大等。如果是这样,有什么可能的解决方案?我从来没有真正使用过这样的数据库模式,所以我认为我应该寻求帮助,而不是在未来被搞砸。
我相信有些人可能会问更新可能多久发生一次。说实话,我并没有期待太多。我们的目录中目前有 2k 个成员,我不希望我们在任何时候都有超过 10k 个活跃成员。我还认为我们最多会有 50 种不同的期权类型,但出于安全和未来的目的,我允许多达 1000 种不同的期权类型。
考虑到这一小块,有人对我应该如何从这里开始有任何建议吗?