[英]How to design a database to represent data that changes in structure?
正在设计数据库来存储和跟踪Web表单内容的历史记录。 通常,这不会有问题。 天真的实现是一个history
表,它记录表单字段内容以及时间戳。
问题是:此表格可能会随着时间而改变。 字段可能会被重命名,添加或删除。
如何建模并确保整个历史记录中的数据完整性。
我现在的想法是,可以仅使用两个字段来完成history
表: timestamp
和data
。 并且,在这种情况下, data
将是与获取快照时的表单字段及其数据对应的JSON字符串。 这意味着该软件可以随时显示表单的回滚版本,而不管结构可能如何更改。
在数据库中表示此的其他方法可能是什么?
使用Python / Django和MySQL,这可能不相关。
编辑1:
澄清。 想象一下要在您无法控制的网站上记录表单的历史记录。 这是关于创建一个数据库来存储和记录该页面的历史记录。 认为Git的页面的格式和数据可以每年或两年更改一次结构和内容。
编辑2:
一种选择是创建一个复杂的表结构,从而可以通过使用一个表来描述表单,该表存储了在任何给定时间可用的各种类型的表单字段,然后form_contents
或form_history
表最终会将它们全部粘合在一起,形成一个结构,可以记录结构随时间变化的表单的历史记录。 我看到这可能变得非常复杂。
如果我对您的理解正确,则可能会执行以下操作:
CREATE TABLE IF NOT EXISTS `form_history` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`when` datetime NOT NULL,
`field_accept` varchar(255) DEFAULT NULL,
`field_accesskey` varchar(255) DEFAULT NULL,
`field_alt` varchar(255) DEFAULT NULL,
`field_autocomplete` varchar(255) DEFAULT NULL,
`field_autofocus` varchar(255) DEFAULT NULL,
`field_checked` varchar(255) DEFAULT NULL,
`field_class` varchar(255) DEFAULT NULL,
`field_contenteditable` varchar(255) DEFAULT NULL,
`field_contextmenu` varchar(255) DEFAULT NULL,
`field_data` text DEFAULT NULL,
`field_dir` varchar(255) DEFAULT NULL,
`field_disabled` varchar(255) DEFAULT NULL,
`field_draggable` varchar(255) DEFAULT NULL,
`field_dropzone` varchar(255) DEFAULT NULL,
`field_form` varchar(255) DEFAULT NULL,
`field_formaction` varchar(255) DEFAULT NULL,
`field_formtarget` varchar(255) DEFAULT NULL,
`field_height` int unsigned DEFAULT NULL,
`field_hidden` varchar(255) DEFAULT NULL,
`field_id` varchar(255) DEFAULT NULL,
`field_lang` varchar(255) DEFAULT NULL,
`field_list` varchar(255) DEFAULT NULL,
`field_max` varchar(255) DEFAULT NULL,
`field_maxlength` int unsigned DEFAULT NULL,
`field_min` varchar(255) DEFAULT NULL,
`field_multiple` varchar(255) DEFAULT NULL,
`field_name` varchar(255) DEFAULT NULL,
`field_pattern` varchar(255) DEFAULT NULL,
`field_placeholder` varchar(255) DEFAULT NULL,
`field_readonly` varchar(255) DEFAULT NULL,
`field_required` varchar(255) DEFAULT NULL,
`field_size` int unsigned DEFAULT NULL,
`field_spellcheck` varchar(255) DEFAULT NULL,
`field_src` varchar(255) DEFAULT NULL,
`field_step` int unsigned DEFAULT NULL,
`field_style` varchar(255) DEFAULT NULL,
`field_tabindex` int unsigned DEFAULT NULL,
`field_title` varchar(255) DEFAULT NULL,
`field_translate` varchar(255) DEFAULT NULL,
`field_type` varchar(255) DEFAULT NULL,
`field_value` varchar(255) DEFAULT NULL,
`field_width` int unsigned DEFAULT NULL,
PRIMARY KEY (`id`), KEY (`when`)
) ENGINE=InnoDB COMMENT='Field definitions';
如果这对您很重要,也可以为事件属性添加列。
这是一些示例数据:
|----|---------------------|-----|-----------------|-----|------------|-----|
| id | when | ... | field_maxlength | ... | field_name | ... |
|----|---------------------|-----|-----------------|-----|------------|-----|
| 1 | 2015-06-01 00:00:01 | ... | 10 | ... | username | ... |
| 2 | 2015-06-01 00:00:01 | ... | 10 | ... | password | ... |
| .. | ................... | ... | ............... | ... | .......... | ... |
| 17 | 2015-06-08 00:00:01 | ... | 32 | ... | username | ... |
| 18 | 2015-06-08 00:00:01 | ... | 32 | ... | password | ... |
| 19 | 2015-06-08 00:00:01 | ... | 25 | ... | fname | ... |
| 20 | 2015-06-08 00:00:01 | ... | 25 | ... | lname | ... |
| .. | ................... | ... | ............... | ... | .......... | ... |
|----|---------------------|-----|-----------------|-----|------------|-----|
这个非常简单的示例数据仅显示表单上的两个字段( username
和password
)。 在第1个中,它们的最大maxlength
均为10,但在第8个中,它们的最大maxlength
值增加到32,并且将两个新字段添加到表单中: fname
和lname
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.