一个人有一个名字和多个别名。人可以按名称和别名索引。所以我设计了两个表存储这种关系:和。像这样:
<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;长度。
有更好的方法吗?
答案 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