如何将可版本的数据存储在数据库中



我想在我即将推出的Web应用中实现一些登台/版本化功能。

尽管我已经提到了下面的标签mysql/doctrine和mongodb/mongoose,但实际上我不限制其中之一。这些只是我通常与之合作的。我会选择最适合的技术。

基本上,我想允许我的用户还原更改,保存草稿(分支(,发布更改(合并/提交(等。与git的代码几乎相同,我希望此行为用于数据。

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

虽然简单的桌子并不是那么难,但是当拥有多个关系的桌子时,我很难找到一个良好/干净的解决方案。我想到的每种方法都会产生大量的冗余数据,或者看起来太复杂了。

想象以下数据,其中每个 post 可以具有多个 tags

-- 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_tag表不正确。尤其是因为我最终还有大约5个相关表。

在与包含二进制数据或大字符串的表具有一致性的关系时,这甚至更糟。无缘无故地复制它们将导致大量无用的数据。

,但也许是要走的路?

肯定您的 post超过 id?(如果是这样,编辑以添加省略号或其他内容。(

Tag表。从post_tagid,然后用label替换tag_id。这是在"帖子"中添加"标签"的好架构:

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的rots之一:"归一化,但不要过分归一化。"更多:适当时使用UNSIGNED和/或NOT NULL

以上仅解决"标签"。如果您想讨论版本操作,请将其作为一个单独的问题分开。将两个无关的问题一起提出并不好。(授予"标记" May 是"版本控制"的工具,但我认为不是。(

相关内容

  • 没有找到相关文章

最新更新