2016-07-28 4 views
0

У одного человека есть одно имя и множественный псевдоним. Человек может индексировать по имени и псевдониму. Поэтому я создаю два стола для хранения этих отношений: и. Пример:mysql store muptiple alias для одного человека

<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.

есть ли лучший способ сделать это?

+0

Не уверен, что я полностью понять ваш вопрос. Хотите ли вы сохранить различное количество псевдонимов для каждого пользователя, а также сохранить их уникальными? Может быть, 'trigger' ... – sgeddes

+0

Я имею в виду, что хочу хранить различное количество псевдонимов для каждого пользователя. И уникальное ограничение: (имя, каждый из псевдонимов) , если имя нового пользователя дублируется, но псевдоним отличается (число псевдонима или текстовое), это приемлемо. Если имя нового пользователя и псевдоним все дубликаты, это неприемлемо. – xwl

ответ

0

Я согласен с уникальным ограничением, но оно должно быть UNIQUE CONSTRAINT (user_id, alias) на столе alias. Но я disagee с 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 
+0

'sorted_alias_str' используется для уникального constrant. ** Требование уникально constrant должно on (имя_пользователя, each_user_alias) **. Если имя нового пользователя дублируется, но псевдоним отличается (число псевдонима или каждый текст), это приемлемо. Если новое имя пользователя и псевдоним все дубликаты, это неприемлемо – xwl

+0

@xwl Извините, опечатка там, я имел в виду то, что вы сказали. Когда я написал этот ответ, я был на сотовом телефоне. –

1

Уникальное ограничение должно быть на (user_id, name). Это не позволяет одному человеку (user_id) иметь один и тот же псевдоним несколько раз.

0

Что вы уже дали одному пользователю несколько псевдонимов. Сложное уникальное ограничение гарантирует, что один пользователь не будет иметь один и тот же псевдоним более одного раза.

<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 
+0

Если таблица псевдонима является редактируемой пользователем, это более сложная реализация.Исправление написания псевдонима одного пользователя от «Джона» до «Джона» потребовало бы добавления новой строки «Джон» к псевдониму и обновления user_alias из alias_id, соответствующего «Джону», новому псевдониму нового псевдонима «Джон», , – bds

Смежные вопросы