在 SQL 数据库中以 'aliases' 的形式将用户彼此连接起来,而无需复制数据条目
connect users to each other as 'aliases' in an SQL database without duplicating data-entries
需要一点建议。我有一个项目将用户存储在数据库中,并确定何时有两个或更多用户实际上是同一个人。因此,如果我注册了 Bob、Joe、Tom、Sam、Fred 和 Lucy,后来发现(通过许可或其他方式)Joe、Tom 和 Lucy 实际上是同一个人,我想记录下来这样的关系,如果我搜索其中任何一个,其他名称或 'aliases' 也会出现,无论连接如何。
可能在不同的时间知道 Tom = Lucy,后来知道 Joe = Lucy,或者存在 Joe -> Tom -> Lucy 的线性进展,但如果我搜索 Lucy,Tom 和 Joe 都应该出现作为连接或别名,反之亦然。
只是在寻找关于用户 table 设置的想法,这将允许通过简单的搜索查询实现这一点,而无需与手动填写的额外 'aliases' 字段建立联系(即将连接的用户的每个组合放入一个字符串字段作为一个坏例子)。 Sub table 关系是我目前正在考虑的地方。不确定如何在不生成重复的手动数据输入的情况下以最佳方式处理它。
伪SQL就可以了。主要是想就如何最好地完成这项工作产生想法。感谢您提前输入!
这本质上是一个 connected components 问题。将数据视为无向图,其中顶点是人,边表示别名。我们想要找到连接的组件并在添加新边(别名)时更新它们。
我们可以有一个 table 的名称和一个附加的 alias
列,其值表示相应行所属的组件。最初每个人都会在他们自己的组件中(alias
最初是唯一的)。当要在 say person A
和 B
之间建立别名时,我们更新组件中属于 B
(或 A
) 与 A
(或 B
)的 alias
列的值。这将合并组件。
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 查询的工作示例。
需要一点建议。我有一个项目将用户存储在数据库中,并确定何时有两个或更多用户实际上是同一个人。因此,如果我注册了 Bob、Joe、Tom、Sam、Fred 和 Lucy,后来发现(通过许可或其他方式)Joe、Tom 和 Lucy 实际上是同一个人,我想记录下来这样的关系,如果我搜索其中任何一个,其他名称或 'aliases' 也会出现,无论连接如何。
可能在不同的时间知道 Tom = Lucy,后来知道 Joe = Lucy,或者存在 Joe -> Tom -> Lucy 的线性进展,但如果我搜索 Lucy,Tom 和 Joe 都应该出现作为连接或别名,反之亦然。
只是在寻找关于用户 table 设置的想法,这将允许通过简单的搜索查询实现这一点,而无需与手动填写的额外 'aliases' 字段建立联系(即将连接的用户的每个组合放入一个字符串字段作为一个坏例子)。 Sub table 关系是我目前正在考虑的地方。不确定如何在不生成重复的手动数据输入的情况下以最佳方式处理它。
伪SQL就可以了。主要是想就如何最好地完成这项工作产生想法。感谢您提前输入!
这本质上是一个 connected components 问题。将数据视为无向图,其中顶点是人,边表示别名。我们想要找到连接的组件并在添加新边(别名)时更新它们。
我们可以有一个 table 的名称和一个附加的 alias
列,其值表示相应行所属的组件。最初每个人都会在他们自己的组件中(alias
最初是唯一的)。当要在 say person A
和 B
之间建立别名时,我们更新组件中属于 B
(或 A
) 与 A
(或 B
)的 alias
列的值。这将合并组件。
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 查询的工作示例。