Проектирование базы данных на нескольких региональных рынках с MySQL
Я ищу руководство по структуре базы данных для многорегионального веб-сайта.
Я настраиваю веб-сайт, похожий на craigslist.com, который позволит пользователям публиковать объявления в своем городе. Я использую базу данных MySQL.
Я хочу, чтобы в качестве подпапок были привязаны регионы к поддоменам, например, ca.mysite.com переходит на mysite.com/ca.
Мой вопрос заключается в том, как мне управлять базами данных, когда я хочу добавить другой город на свой веб-сайт.
Если я использую разные базы данных для каждого города, то пользователи не смогут войти в другие города, поскольку их данные для входа хранятся в том городе, в котором они зарегистрированы, в таблице пользователей его базы данных.
Это не может быть проблемой, так как контент зависит от города, например, craigslist. Но если они захотят связаться с пользователями в других городах, они не смогут.
Кроме того, в общем случае будут повторяться имена пользователей и адреса электронной почты, поскольку пользователи могут регистрироваться во всех городах, используя одинаковые адреса электронной почты и имя пользователя.
Если я создаю центральную базу данных, например, с таблицей пользователей и таблицей сообщений, а затем создаю отдельную базу данных для каждого города со всеми "постами" этих городов, то при отображении основной информации мне нужно будет обратиться к базе данных по конкретному городу плюс центральная БД, которая хранит информацию о пользователе.
В качестве альтернативы я мог бы хранить все в одной базе данных и сохранять местоположение вошедшего в систему пользователя в файле cookie, передавать его в переменную сеанса и использовать это местоположение как часть запроса базы данных при отображении результатов поиска и т. Д.
Однако не добавит ли это ненужные накладные расходы к каждому запросу?
Например, для каждого поиска необходимо добавить AND AND = $user_location.
Я действительно понятия не имею, что будет лучшим методом здесь.
Заранее спасибо за любую помощь в этом.
2 ответа
Кажется, что вы до сих пор не знаете четко систему, которую хотите построить. Перед началом проектирования базы данных для этой системы, пожалуйста, убедитесь, что у вас есть полное описание системных требований. Вот некоторые примеры вопросов, которые помогут вам уточнить:
- Какие функции предлагает ваш сайт?
- Какие действия могут выполнять пользователи вашей системы? Есть ли ограничения для каждого действия?
Некоторые другие вопросы, касающиеся производительности системы: - Сколько пользователей вы ожидаете использовать вашу систему? - Как быстро и правильно каждое действие должно быть подано? Какие действия используются часто?
Нет смысла проектировать систему без тщательного понимания системных требований.
Итак, вот пример дизайна базы данных и как она может соответствовать вашим требованиям.
Cities(cityid, cname)
Users(userid, fname, lname, cityid, currcityid)
Messages(mid, senderid, receiverid, content)
Adverts(aid, title, content, userid, cityid)
Когда пользователь меняет город, обновите currcityid
поле в своем ряду в Users
Таблица.
Когда пользователь размещает объявление в городе, вставьте новую строку в Adverts
Таблица. userid
а также cityid
новой строки - идентификаторы соответствующего пользователя и города.
Когда пользователь отправляет сообщение другому пользователю в системе, добавьте строку в Messages
Таблица. senderid
и receiverid
новой строки - идентификаторы соответствующих пользователей.
Запросить все объявления в городе: SELECT * FROM Adverts WHERE cityid = $cityid
Запросить все объявления пользователя: SELECT * FROM Adverts WHERE userid = $userid
Запросить все объявления пользователя в определенном городе: SELECT * FROM Adverts WHERE cityid = $cityid AND userid = $userid
Надеюсь это поможет.