2012-05-18 3 views
3

Я разрабатываю систему, в которой есть база данных для хранения пользователей и информации, связанной с пользователями. Более конкретно, каждый пользователь в таблице имеет очень мало информации. Что-то вроде Имя, пароль, uid.Базовый дизайн и сложность базы данных

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

Так запрос данных из контейнера будет выглядеть примерно так:

SELECT content 
    FROM containers 
WHERE (containerName='someContainer' AND owner='someOwner'); 

Мой вопрос, если это хороший способ, я имею в виду масштабируемость сказать, что у нас есть тысячи пользователей с ... скажем По 5 контейнеров (однако каждый пользователь может иметь различное количество контейнеров, но 5, вероятно, будет типичным случаем). Моя забота заключается в том, что поиск через базу данных будет медленным, когда есть 5 записей из 5 * 1000 записей, которые я мог бы использовать в одном запросе. (Обычно нам может понадобиться только конкретный контент контейнера из нашего запроса, и мы изучаем базу данных, в основном накладные расходы на 4995 записей, правильно? И что произойдет, если я подписал миллион пользователей, это станет огромной таблицей, которая просто интуитивно чувствую себя плохой идеей.

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

Любая помощь в понимании того, как проектировать это было бы весьма признателен, я надеюсь, что все ясно и легко следовать.

+0

Будете ли вы иметь все контейнеры уникальными? Или это будет 20-30 контейнеров, которые будут доступны для всех пользователей? – vyegorov

+0

Хмм .. Каждая пара пользователь-контейнер уникальна, но у разных пользователей может быть экземпляр «того же контейнера». Таким образом, содержание userA-containerA отличается от содержимого userB-containerA, имеет смысл? – qrikko

+0

Затем вы должны создать отдельную таблицу для контейнеров, используйте 'container_id' в таблице' content' и соедините 3 таблицы. Это будет работать намного быстрее и займет меньше места. – vyegorov

ответ

0

Принятым способом обработки этого является создание INDEX на поле owner. Таким образом, MySQL оптимизировал запросы для owner = 'some value' условий.

Смотрите также: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Вы правы, говоря, что в 1000 таблиц не является масштабируемым. Как только вы начнете получать несколько миллионов записей, вы можете подумать о том, чтобы сделать очертание (разделить записи на несколько местоположений на основе пользовательских атрибутов) ... но к тому времени вы уже были бы успешными, я думаю ;-)

+0

Wow, спасибо, что, похоже, именно то, что я ищу, спасибо! – qrikko

0

Если это база данных RBMS (например, Oracle/MySQL), вы можете создавать индексы в столбцах, которые часто запрашиваются для оптимизации обхода таблицы и запроса. Индексы автоматически создаются для ключей PRIMARY и (необязательно) FOREIGN.

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