mysql存储一个人的muptiple别名

时间:2016-07-28 01:27:20

标签: python mysql database web-services

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

<user table>

|user_id    | int
|name       | varchar



<alias table>

|user_id    | int
|alias      | varchar

两个由user_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'
带有唯一约束的

(name,sorted_alias_str)

但用户的别名数量受限于&lt; sorted_alias_str&#39;长度。

有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

唯一约束应该在(user_id,name)上。这可以防止一个人(user_id)多次使用相同的别名。

答案 1 :(得分:0)

我同意拥有一个唯一约束,但它应该是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

答案 2 :(得分:0)

您已经为单个用户提供了多个别名。复合唯一约束可确保一个用户不会多次使用相同的别名。

// app / pods / teams / index / route.js
export default AuthenticationRoute.extend({
  access: ['admin', 'instructor'],
  model: function() {
    return this.store.find('account', this.auth.get('currentUser.accountId'));
  }
});

// app / pods / teams / index / controller.js
export default Ember.Controller.extend({

});

// snippet from app / pods / teams / index / templabe.hbs
{{#each team in model.teams}}
     <tr>
         <td width="25%">{{#link-to 'teams.show' team.id}}{{team.name}}{{/link-to}}</td>
         <td width="20%">{{format-date team.startsAt 'DD-MM-YYYY'}}</td>
         <td width="15%">{{team.users.length}}</td>
         <td width="40%">{{team.licenseTemplate.name}}</td>    
   </tr>
{{/each}}

每个UNIQUE约束也是一个索引。

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

<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