/ / mysql зберігає псевдонім для однієї людини - python, mysql, database, web-services

mysql зберігати псевдонім для однієї людини - python, mysql, database, web-services

Одна людина має одне ім'я та кілька псевдонімів. 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