【发布时间】:2015-08-07 11:26:25
【问题描述】:
我们有一个相当陈旧的数据库,其中包含大量个人以及他们已完成的许多成就。历史上几乎没有采取任何措施来阻止重复的个人数据,因此我们最终陷入了数据非常脏的情况。可以在here 找到一个大大简化的版本。
我们现在正在重新设计架构和用户界面。我们将为用户提供一个工具来将他们的个人合并在一起。在提供的示例中,Dave 和 David 显然是同一个人,总共取得了 4 项成就。
鉴于用户会犯错误并且涉及的表比示例中的多得多,因此我正在寻找一种便于数据合并的架构设计,尤其是在(何时!)用户不可避免地会犯错误。
某种类型的链接列表似乎是一种解决方案,但对于这个用例来说并不完全有效。是否有任何其他概念可能适用于这种情况?任何可能合适的特定设计模式?
编辑:由于今天 SQLFiddle 相当不稳定,这里是 sqlfiddle 上的 create/insert/select sql:
CREATE TABLE individual
(`individual_id` int, `forename` varchar(50), `surname` varchar(50))
;
CREATE TABLE achievement
(`achievement_id` int, `name` varchar(50), `description` varchar(50))
;
CREATE TABLE individual_achievement
(`individual_id` int,`achievement_id` int)
;
INSERT INTO individual
(`individual_id`, `forename`, `surname`)
VALUES
(1, 'Dave', 'Deane'),
(2, 'David', 'Deane')
;
INSERT INTO achievement
(`achievement_id`, `name`, `description`)
VALUES
(1, 'unit_1', 'Unit 1'),
(2, 'unit_2', 'Unit 2'),
(3, 'unit_3', 'Unit 3'),
(4, 'unit_4', 'Unit 4')
;
INSERT INTO individual_achievement
(`individual_id`,`achievement_id`)
VALUES
(1, 1),
(1, 3),
(2, 2),
(2, 4)
;
select * from individual i
join individual_achievement ai using (individual_id)
join achievement a using (achievement_id)
编辑 2: 刚刚找到这个 very similar question,希望 4 年后也有其他解决方案。
【问题讨论】:
-
看不到 SQLFiddle,但你为什么不自动合并成就而不是让用户来做呢?
-
合理的问题@plalx。我们没有足够的可用信息来可靠地检测重复项。在很多情况下,我们只有姓氏和姓氏,这绝对是不够的。在许多情况下,我们确实有出生日期,但即便如此,也有可能是错误的。我们的计划是向用户突出显示我们认为可能重复的那些,但只有用户才能确定他们的个人是否重复。
标签: design-patterns database-design merge database-schema