Одна людина має одне ім'я та кілька псевдонімів. Can Людина може індексувати ім'я та псевдонім. Тому я розробляю два таблиці зберігання цього відношення: а. Подобається це:
<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"
з унікальним обмеженням (назва, sorted_alias_str)
але кількість псевдоніма користувача обмежується довжиною "sorted_alias_str".
чи є кращий спосіб зробити це?
Відповіді:
1 для відповіді № 1Унікальне обмеження має бути на (user_id, name). Це запобігає одному користувачеві (user_id) мати один і той же псевдонім кілька разів.
0 для відповіді № 2
Те, що ви вже дає одному користувачеві кілька псевдонімів. Складене унікальне обмеження гарантує, що один користувач не буде мати однаковий псевдонім більше одного разу.
<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)
Кожне обмеження UNIQUE також є індексом.
Для ще більшої структури можна помістити всі відомі псевдоніми в одну таблицю.
<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
0 для відповіді № 3
Я згоден з унікальним обмеженням, але це має бути 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