gpt4 book ai didi

mysql - 如何在数据库中存储可版本化的数据?

转载 作者:行者123 更新时间:2023-11-29 19:04:50 25 4
gpt4 key购买 nike

我想在我即将推出的网络应用程序中实现一些暂存/版本控制功能。

虽然我在下面提到了 MySQL/Doctrine 和 MongoDB/Mongoose 标签,但实际上我并不受其中之一的约束。这些只是我经常合作的人。我会选择最适合的技术。

基本上,我希望允许我的用户恢复更改、保存草稿(分支)、发布更改(合并/提交)等。与 git 对代码所做的几乎相同,我希望对数据进行这种行为。

我知道这种行为在很大程度上取决于应用程序代码,但首先我需要找到合适的数据库架构。

虽然对于简单的表来说这并不难,但当表具有多种关系时,我很难找到一个好的/干净的解决方案。我能想到的每种方法要么会产生大量冗余数据,要么看起来太复杂。

想象一下以下数据,其中每个帖子可以有多个标签:

-- Create syntax for TABLE 'post'
CREATE TABLE `post` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
KEY `name` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Create syntax for TABLE 'post_tag'
CREATE TABLE `post_tag` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`post_id` int(11) DEFAULT NULL,
`tag_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- Create syntax for TABLE 'tag'
CREATE TABLE `tag` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`label` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在每次更改时复制整个 post 和 post_tag 表感觉不对。特别是因为我最终会得到大约另外 5 个相关的表格。

当与包含二进制数据或大字符串的表建立 OneToMany 关系时,情况会更糟。每次更改时无缘无故地复制它们会导致大量无用数据。

但这也许是正确的选择?

最佳答案

您的帖子肯定不止有id吗? (如果是这样,请编辑以添加省略号或其他内容。)

扔掉标签表格。从 post_tag 中丢弃 id 并将 tag_id 替换为 label。这是一个向“帖子”添加“标签”的好模式:

CREATE TABLE `post_tag` (
`post_id` int(11) NOT NULL,
`tag` varchar(64) NOT NULL,
PRIMARY KEY (post_id, label), -- also prevents duplicate entries
INDEX(tag, post_id) -- for going the other way
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Rick's RoTs 之一:“正常化,但不要过度正常化。”更多:在适当的时候使用 UNSIGNED 和/或 NOT NULL

以上仅涉及“标记”。如果您想讨论版本控制,请将其作为一个单独的问题分开。将两个不相关的问题放在一起并不好。 (当然,“标记”可能是“版本控制”的工具,但我认为不是。)

关于mysql - 如何在数据库中存储可版本化的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43588359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com