2015-02-24 3 views
1

У меня есть концептуальный вопрос.SQL-таблица ИЛИ поле

В моей базе данных есть таблица, в которой хранится информация о людях. Одним из его полей является их номер телефона (8 цифр для моей страны).

Дело в том, что в некоторых случаях у двух или более человек будет одинаковый номер телефона.

Мой вопрос: будет ли лучший выбор хранить номера телефонов на другой таблице, а затем ссылаться на него с помощью внешнего ключа, а не просто хранить их как поле? Если это так, будет ли результат одинаковым для любого размер БД?

Я не знаю, будет ли это иметь значение, но таблица будет содержать не более 600 000 - 800 000 записей, и я думаю, что совпадающие номера телефонов будут составлять около 10% от общего количества записей.

EDIT:

-Каждый запись может иметь до 4 телефонных номеров (две строки и две ячейки)

ОБЕ случаи будут происходить, будет иногда, когда пользователи будут искать все люди, имеющие конкретный номер, и время, когда пользователь захочет узнать, что все номера телефонов у человека есть

+0

Если у вас есть только один номер телефона для пользователя, вы можете сохранить его как есть. – Alex

+0

Извините, я не сказал этого, я отредактировал вопрос. У каждого человека может быть до 4 номеров –

+1

Я задал бы этот вопрос. Если число изменится для одного пользователя, это будет означать изменение числа для всех пользователей с одинаковым номером? Если это так, я бы использовал отдельную таблицу. В противном случае это кажется маловероятным. – dan08

ответ

1

Технически для нормализации у вас будет отдельная таблица номеров телефонов, а затем таблица PersonPhonenumber.

Однако на практике я редко видел эту структуру для телефонных номеров и адресов. Во-первых, легко совершить ошибку и обновить более одного пользователя или телефона, если вы хотите изменить его.Для другого он добавляет дополнительное соединение, которое кажется ненужным большинству людей. Вы на самом деле не получаете многого, перейдя на этот уровень, кроме небольшого количества дублирования.

Реальный решатель - как вы собираетесь использовать и обновлять номера. Если вы хотите часто обновлять всех людей с одним и тем же номером, лучше всего полностью нормализовать. Если вы обычно хотите обновлять только одного человека за раз, возможно, менее опасно иметь таблицу Person и таблицу номеров PersonPhone.

Если вы хотите историю, то я бы пошел с таблицей людей и таблицей истории aPersonPhoneNumber. Он будет иметь personid, номер телефона, дату начала и дату окончания. Поэтому, когда Джон и Мэри разводятся, его номер телефона будет иметь дату окончания, но ее не будет, и вы могли бы ясно видеть, у кого был номер, когда.

+0

Я получаю вашу мысль и это именно то, о чем я говорил. Однако, что касается производительности. Вы предложили бы создать две таблицы (PhoneNumbers и ContactHistory) или только одну и сохранить все на ней? Я просто волнуюсь из-за того, что в контакте истории, мы будем говорить о приращении около 2.000 записей в день. Попросите меня об этом, и я с радостью приму ваш ответ. –

+0

С хорошей индексацией производительность, скорее всего, будет в порядке, но я не эксперт mysql, так как я более знаком с SQL Server. Если вы решили разделить историю с текущими номерами телефонов, убедитесь, что вы заполняете таблицу истории из триггера, чтобы убедиться, что все изменения задокументированы. , – HLGEM

0

Обычно номер телефона - это просто номер, и без человека не имеет значения. Итак, вы храните его в таблице Person.

Но вы работаете в телефонной компании, для которой номер телефона имеет другое значение и использование (например, история, поиск по телефону, выставление счетов), тогда он должен храниться в отдельной таблице. Надеюсь, это помогло.

+1

Никогда не используйте разделитель для более чем одного номера. Если у вас будет несколько телефонных номеров на человека, они должны быть связанной таблицей. Я согласен с остальными, что вы сказали, но хранение списков с разделителями-запятыми - это sqpt antipttern. – HLGEM

+0

Это помогло, это не телефонная компания, но телефоны действительно будут использоваться по ряду других причин (телефон lokup и история будут наиболее популярны). будет ли их sepparating значительно улучшать производительность? –

+1

Я согласен, что разделитель - плохая идея. Для поиска телефона вы можете сделать индекс в столбце номера телефона. Для истории это не работает. – MaxZoom

1

Если у вас есть более 1 номер телефона на человека

Существует хорошая причина, чтобы установить новую таблицу, как: id, user_id, phone, type, description

Так type может быть список дома, работа, Office2, Boss Жена, факс, мобильный и т.д. ...

и description как "рабочее время только", "вечер", "24x7", «Emergency ОНЛ y "и т. д.

Если вы действительно управляете телефонной книгой для своего приложения, это хорошая идея отделить номера телефонов от исходной таблицы пользователей.

0

Если у вас есть два человека с одним и тем же номером телефона, вы столкнулись с проблемой при поиске определенного номера телефона. Поиск определенного номера телефона иногда возвращает более одного результата (10% в соответствии с вашей оценкой). Если вы ищете по номеру телефона И людьми, вы можете потребовать, чтобы все поиски номера телефона включали идентификатор пользователя (имя, фамилия, место и т. Д.). Это зависит от вашей цели.

+0

Оба случая будут происходить, иногда будут возникать случаи, когда пользователи будут искать всех людей, имеющих определенный номер, и раз, когда пользователь захочет узнать, что все номера телефонов у человека есть –

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