在sql数据库中将用户作为“别名”相互连接,而不复制数据项

goqiplq2  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(340)

我需要一些建议。我有一个项目,将用户存储在数据库中,并确定何时两个或更多用户实际上是同一个人。因此,如果我注册了鲍勃、乔、汤姆、山姆、弗雷德和露西,后来发现(通过入院或其他方式)乔、汤姆和露西实际上是同一个人,我想记录这种关系,这样,如果我搜索其中任何一个,其他的名字或“别名”也会出现,不管联系如何。
在不同的时间可以知道tom=lucy,然后joe=lucy,或者joe->tom->lucy是线性的,但是如果我搜索lucy,tom和joe都会显示为连接或别名,反之亦然。
只是想在用户表的设置上找到一些想法,这样就可以通过一个简单的搜索查询实现这一点,而无需使用手工填写的额外“别名”字段来建立连接(例如,将每个连接用户的组合放入一个字符串字段是一个糟糕的例子)。子表关系是我目前正在思考的问题。不知道如何在不生成重复的手动数据输入的情况下以最佳方式进行。
伪sql很好。主要是想产生如何最好地实现这一点的想法。感谢您的预先输入!

agxfikkp

agxfikkp1#

这本质上是一个连接组件的问题。把数据想象成一个无向图,其中顶点是人,边表示别名。我们希望找到连接的组件,并在添加新边(别名)时更新它们。
我们可以有一个名字表和一个额外的 alias 列,其值表示相应行所属的组件。最初,每个人都将在自己的组件中( alias 最初将是唯一的)。当一个别名出现在说人之间时 A 以及 B 是要建立的,我们更新 alias 所属组件中所有人员的列 B (或 A )价值 aliasA (或 B ). 这将合并组件。

CREATE TABLE persons (
 id INTEGER PRIMARY KEY,
 name varchar(100),
 alias INTEGER NOT NULL
)

INSERT INTO persons (id, name, alias)
VALUES (1, 'Bob', 1), (2, 'Joe', 2), (3, 'Tom', 3),
       (4, 'Sam', 4), (5, 'Fred', 5), (6, 'Lucy', 6)

-- Tom = Lucy
UPDATE persons
SET alias = (SELECT alias FROM persons WHERE name = 'Tom')
WHERE alias = (SELECT alias FROM persons WHERE name = 'Lucy')

-- Joe = Lucy
UPDATE persons
SET alias = (SELECT alias FROM persons WHERE name = 'Joe')
WHERE alias = (SELECT alias FROM persons WHERE name = 'Lucy')

-- linear progression of Tom = Lucy = Joe
-- Run the above queries one after another

-- Search for all alias of Tom

SELECT *
FROM persons WHERE alias = (SELECT alias FROM persons WHERE name = 'Tom')

下面是一个sql fiddle查询的工作示例。

相关问题