mysql store一人多别名

2024-04-24 04:11:58 发布

您现在位置:Python中文网/ 问答频道 /正文

一个人有一个名字和多个别名。一个人可以按名字和别名编制索引。所以我设计了两个表来存储这种关系:和。像这样:

<user table>

|user_id    | int
|name       | varchar



<alias table>

|user_id    | int
|alias      | varchar

两个表由用户\ id连接。因此一个用户可以设置多个别名并可以按别名索引。但现在我们需要添加唯一约束。如果用户名和每个别名相同,则视为重复!因此,我认为使用一个如下表存储:

<user table>

|user_id           | int
|name              | varchar
|sorted_alias_str  | varchar


ps:  sorted_alias_str store each alias which join by comma. like: 'name1,name2'

具有唯一约束(名称、排序的\u别名\u str)

但用户别名的数量受“sorted\u alias\u str”长度的限制。你知道吗

有没有更好的办法?你知道吗


Tags: store用户nameid关系tablealias名字
3条回答

唯一约束应该在(user\u id,name)上。这样可以防止一个人(用户id)多次使用同一别名。你知道吗

我同意使用唯一约束,但它应该是UNIQUE CONSTRAINT (user_id, alias)表上的alias。但我对sorted_alias_str感到失望。此列的维护将很麻烦,因为每次用户添加或删除别名时都必须重新计算它。相反,您可以使用GROUP_CONCAT为每个用户获取别名的CSV列表,例如

SELECT t1.user_id,
       t1.name,
       t2.aliases
FROM user t1
INNER JOIN
(
    SELECT user_id, GROUP_CONCAT(COALESCE(alias, 'NA') AS aliases
    FROM alias
    GROUP BY user_id
) t2
    ON t1.user_id = t2.user_id

你已经给了一个用户多个别名。复合唯一约束可确保一个用户不会多次使用同一别名。你知道吗

<user table>

|user_id    | int (unique)
|name       | varchar

<alias table>

|user_id    | int (unique, also ref to user.user_id)
|alias      | varchar

unique constraint (user_id, alias)

每个唯一约束也是一个索引。你知道吗

对于更多的结构,可以将所有已知别名放在一个表中。你知道吗

<user table>

|user_id    | int (unique)
|name       | varchar

<user_alias table>

|user_id    | int (ref to user.user_id)
|alias_id   | int (ref to alias.alias_id)

unique constraint (user_id, alias_id)

<alias table>

|alias_id   | int (unique)
|alias      | varchar

最后,如果您承认一个名称只是一个特别标识的别名,您可以添加更多的结构:

<user table>

|user_id    | int (unique)
|name       | int (ref to alias.alias_id)

<user_alias table>

|user_id    | int (ref to user.user_id)
|alias_id   | int (ref to alias.alias_id)

unique constraint (user_id, alias_id)

<alias table>

|alias_id   | int (unique)
|alias      | varchar

相关问题 更多 >