SQL Архитектура хранения контактов

12 3
O
На сайте с 29.05.2008
Offline
195
1417

Здравствуйте.

Делаю модуль контактов для системы менеджмента. Может, кто знает, как выполнен контакт менеджер в Mac OS, iOS. Вот нужно то же самое, но в WEB. Столкнулся с проблемой архитектуры базы. Суть в следующем. Один контакт может иметь 10 типов полей. Один контакт может иметь неограниченное количества полей. Соответственно, вариант с одной таблицей, типа "ID phone last-name first-name..." отпадает.

Как я представляю решение.

Есть одна таблица с зарегистрированными контактами, которая содержит PRIMARY KEY `id`, FOREIGN KEY `owner`(владелец контакта, который сможет видеть запись в списке), FOREIGN KEY `context` (группа). Назовем эту таблицу contacts.

Есть вторая таблица, в которой содержатся поля для каждой из записей. Одно поле = одна запись. Например, структура таблицы имеет следующий вид: PRIMARY KEY `id`, ENUM('phone', 'last-name', 'first-name', 'country') `type`, VARCHAR(512) `value`, FOREIGN KEY `entry` => `contacts`.`id`.

Что меня смущает.

Вот, например, сам номер телефона я решил хранить в INT UNSIGNED. Как мне хранить его в INT, если я должен выбрать компромиссный тип поля для `value` и я выбрал VARCHAR(512).

Насколько производительна подобная архитектура для выборку, а главное, как мне кажется, для создание нового контакта? По сути, нужно будет сделать INSERT сразу 5-10 записей. Не будет ли это существенно хуже классической архитектуры, где в одной записи содержатся сразу все поля?

Пример классической схемы, с которой я начинал.

png zoomit.png
S
На сайте с 23.05.2004
Offline
316
#1

Почему поле телефона int а не тот же varchar ? Телефоны могут по разному записываться http://stdcxx.apache.org/doc/stdlibug/26-1.html

Это просто подпись.
O
На сайте с 29.05.2008
Offline
195
#2

Stek, потому, что я храню не форматированный номер, а это число. К тому же, сайт предназначен для одного региона, поэтому, VARCHAR по сравнению с CHAR, INT не добавляет преимуществ (все поля, занимают ровно 12 цифр). Обсуждаем в соседней ветке.

S
На сайте с 23.05.2004
Offline
316
#3

Экономия на спичках в виде размера поля ничего не даст.

Сделайте структуру из двух таблиц, как вы и описали. Загоните туда приблизительный объем данных и посмотрите, как сервер себя будет вести.

Все равно поля юзера будете по ключу вытягивать.

O
На сайте с 29.05.2008
Offline
195
#4

Stek, но owner то один, а вот полей на 1 запись может быть вообще 100, а это 100 выборок. Вот сомневаюсь. Никогда не работал с сильно заполненными базами. 1 миллион записей, это как семечки щелкать? Вот у меня, например, на iPhone, есть программа Todo Pro. Раньше она летала, но стоило мне использовать ее один год, так теперь, даже списки с небольшим количеством задач, открываются по 3 секунды. Кстати, база там в SQLLite. Вот думаю, не ждет ли меня подобное?

Кто имел дело с таблицами InnoDB, где количество записей больше миллиона, пожалуйста, поделитесь впечатлениями. Я просто не в теме, но мне очень интересно! :)

S
На сайте с 23.05.2004
Offline
316
#5

Ну вытянете 100 связанных записей, не трагедия совершенно. Зато нормальная расширяемость при случае.

Понадобиться хранить фотографию, скан визитки контакта - в третью таблицу таким же образом, где уже blob поля.

У меня сейчас на одном из проектов за пару лет данных в похожей табличке, только с text полями, уже под 20 миллионов собралось. Выборка по индексированному varchar полю менее секунды. А по int первичному ключу вообще моментом.

O
На сайте с 29.05.2008
Offline
195
#6

Stek, выходит на каждый тип поля - своя таблица - свой запрос? То-есть, для номера INT нужно создать phone-entries? Насколько накладно, если вместо поля ENUM с типом записи, я создам табличку для каждого из типов записей (примерно 10 таблиц)? Например, те же записки к контакту имеют тип TEXT, не делать же мне все поля типом TEXT? Номер телефона INT(15), URL VARCHAR(255), а имя VARCHAR(50).

edogs software
На сайте с 15.12.2005
Offline
775
#7

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

Потому что какой бы способ хранения контактов данных Вы бы не выбрали, выборка полей контактов по основному ИД юзера - будет практически мгновенной в любом случае.

Если поиск не нужен вообще - не нужно вообще никакой структуры, можно просто тупо сериализованные данные хранить в лонгтексте.

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

Если нужен хитропоиск с исключениями по принципу "носящие желтые туфли, но не носящие красные", то eav вряд ли подойдет в принципе.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
S
На сайте с 23.05.2004
Offline
316
#8

Если вы хотите хранить строго типизированную структуру - то делайте как на вашем скришоте. Если же просто хранить данные, делайте из двух таблиц. Задайте поле text или blob и живите спокойно.

Какой смысл делить на "VARCHAR(255) VARCHAR(50)", если для базы это один и тот же тип.

Строгая типизация нужна, когда вы работаете с жестко заданными данными. А вашем случае, структура из двух таблиц, будет имитацией nosql с выборкой по ключу.

O
На сайте с 29.05.2008
Offline
195
#9

Stek, ну пока что я решил привести таблицу к 3 нормальному виду. То-бишь, под каждое значение - своя таблица + строгая типизация для полей + учет. Критика?

edogs software
На сайте с 15.12.2005
Offline
775
#10
ortegas:
Stek, ну пока что я решил привести таблицу к 3 нормальному виду. То-бишь, под каждое значение - своя таблица + строгая типизация для полей + учет. Критика?

Для хранения - нормально.

Для вставки - Х запросов вместо одного, приложение должно будет само решать вопросы целостности данных.

Для поиска - как Вы будете искать в контактах человека у которого в телефоне есть вхождение 812 (одна таблица), при этом он носит белые штаны (другая таблица) и никогда не был в рио-де-жанейро (третья таблица + негативная выборка) но при этом был в москве (третья таблица и позитивная выборка)? EAV усложняет эту задачу само по себе, а несколько таблиц забивают гвоздь в крышку гроба:)

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий