繁体   English   中英

如何设计一个数据库来表示结构变化的数据?

[英]How to design a database to represent data that changes in structure?

正在设计数据库来存储和跟踪Web表单内容的历史记录。 通常,这不会有问题。 天真的实现是一个history表,它记录表单字段内容以及时间戳。

问题是:此表格可能会随着时间而改变。 字段可能会被重命名,添加或删除。

如何建模并确保整个历史记录中的数据完整性。

我现在的想法是,可以仅使用两个字段来完成history表: timestampdata 并且,在这种情况下, data将是与获取快照时的表单字段及其数据对应的JSON字符串。 这意味着该软件可以随时显示表单的回滚版本,而不管结构可能如何更改。

在数据库中表示此的其他方法可能是什么?

使用Python / Django和MySQL,这可能不相关。

编辑1:

澄清。 想象一下要在您无法控制的网站上记录表单的历史记录。 这是关于创建一个数据库来存储和记录该页面的历史记录。 认为Git的页面的格式和数据可以每年或两年更改一次结构和内容。

编辑2:

一种选择是创建一个复杂的表结构,从而可以通过使用一个表来描述表单,该表存储了在任何给定时间可用的各种类型的表单字段,然后form_contentsform_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      | ... |
| .. | ................... | ... | ............... | ... | .......... | ... |
|----|---------------------|-----|-----------------|-----|------------|-----|

这个非常简单的示例数据仅显示表单上的两个字段( usernamepassword )。 在第1个中,它们的最大maxlength均为10,但在第8个中,它们的最大maxlength值增加到32,并且将两个新字段添加到表单中: fnamelname

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM