Я построил систему управления школой для своих нужд. Размер таблиц колеблется от ~ 200 строк до ~ 30 000 строк / в конце учебного года /.
Некоторые из моих друзей видели эту систему и убеждают меня сделать ее доступной для других школ. Я бы хотел пока попробовать хотя бы в нескольких школах. Учитывая мою текущую архитектуру и виртуальный хостинг, мне пришлось бы хранить все школы в одиночный db, поэтому меня беспокоят два вопроса:
Я не знаю, разумно ли хранить информацию обо всех учащихся, посещаемости, платежах и т. д. Из моей и 10 других школ в общих таблицах в одной базе данных. Лучше я спрошу, чем причиню себе неприятности ..
Любые советы приветствуются :)
300 000 строк - это банальная сумма, когда дело доходит до управления базой данных. Наверное, было бы лучше иметь отдельную схему для каждой школы. Я не уверен, зачем вам смешивать несколько школ вместе.
Что ж, этот вопрос в первую очередь основан на мнении, некоторые посоветуют сделать один дБ для всех школ, а некоторые посоветуют создать 1 дБ для каждой школы .. У обоих методов есть свои преимущества и недостатки ... Например, для одного db для всех потребуется какой-то просмотров для фильтрации записей, которые школе разрешено просматривать с 1 дБ на школу, у вас нет этой "проблемы"
Самая важная вещь, о которой я могу думать, это то, что если все данные хранятся вместе, могут возникнуть проблемы с защитой данных. Отдельные базы данных, по крайней мере, дают вам базовую форму разделения данных, позволяющую ограничить доступ пользователей из одной школы к другим данным с помощью разрешений базы данных, а не логики приложения.
В одной таблице нет ничего плохого, MySQL может обрабатывать миллионы строк. Мой единственный совет: поскольку у вас есть несколько «чистых» разделов, то есть посещаемость, платежи и т. д., И вы расширяетесь на несколько школ, я бы, вероятно, разделил их на таблицы для каждого раздела. Это позволит увеличить объемы расширения в будущем. Вы можете расширить каждый по отдельности, добавив больше столбцов в каждый по мере необходимости, не создавая гигантскую таблицу, если и когда ваша система станет действительно большой. Думаю, сейчас я пытаюсь сказать будущее, чтобы избавить от потенциальной головной боли позже.
@ emsimpson92 В настоящий момент я запускаю сайт на виртуальном хостинге (хотя и с приличными параметрами), где мне нужно войти в раздел администратора, чтобы создать базу данных. Созданный db я затем жестко кодирую в конфигурационный файл Yii2, который запускает всю систему. Так что в настоящее время на карту поставлены технические ограничения. Система не может создавать базы данных в текущем окружении.
@NigelRen На данный момент я реализовал авторизацию для учителей, родителей и учеников - все работает нормально - у всех есть доступ только к определенным данным, поэтому я думаю, что смогу масштабировать логику.
Итак, создайте таблицу для учеников (из всех школ) и таблицу для каждой школы. В таблице учеников вы можете указать школьный идентификатор для каждого ученика.
@Stephen, поймите меня правильно :) Я не упаковываю все данные в один тб; Поместите все логические части в соответствующие таблицы с несколькими таблицами соединений время от времени; только некоторые таблицы имеют длину> 300 тыс. строк и поэтому вызывают сомнения.
@ emsimpson92 да, это была именно моя идея, но я беспокоился о размере и производительности некоторых таблиц. Посещаемость tb, например, имеет статус для каждого ученика для каждого класса, на который он может присутствовать / отсутствовать / опаздывать. После текущего учебного года это только для моих учеников 30 тысяч строк. Думаю, мне нужно проверить, сколько школ заинтересовано в моем приложении. На данный момент я знаю, что могу легко использовать несколько десятков, даже не беспокоясь об ограничениях MySql. Спасибо вам, ребята!
@NigelRen Я тестировал систему на возможность манипулирования параметрами GET / POST, данными локального хранилища, SQL-инъекциями и т. д. Когда учитель запрашивает данные учащихся, которых они обучают, выполняется запрос JOIN для выборки только тех учеников из группы, в которой учитель_id совпадает с аутентифицированный учитель - один из способов, наряду с фильтрами, которые я использую в контроллерах. Работает нормально - как бы разговорно это ни звучало :)






premature optimization is the root of all evil (or at least most of it) in programming
На данный момент вам не стоит об этом беспокоиться. Запустите приложение и по мере масштабирования определите узкие места, а затем попытайтесь найти решение для них.
Can MySql easily handle tables with >300,000 rows?
Прежде всего, используйте лучшие принципы нормализации для структурирования ваших таблиц и отношений. MySQL довольно хорошо справляется с обработкой строк до 10 000 000. но это также зависит от того, как вы индексируете / запрашиваете данные. Используйте правильные индексы db для столбцов, которые вы часто используете для поиска. Большой отказ от "лайков" запросов, но если нужно, используйте поисковую систему, например (elastic, solr).
The system is based on Yii2 at the moment, I've optimized it for max performance - do you think it's wise to try or better work towards solution with a dedicated server and separate db for each school?
У меня очень мало представления о Yii2, но, безусловно, есть гораздо лучшие фреймворки, доступные на php, которые вы можете попробовать, например. ларвел (это даст вам лучшее представление). Конечно, лучше всего разместить это приложение на выделенном сервере. зачем тратить деньги, когда можно получить приватный VPS всего за 5 $ от цифровой океан.
I don't know if it's wise to store all students, attendance, payments etc info from my and 10 others schools across shared tables in single db. I'd better ask than cause trouble to myself..
Нет абсолютно никаких проблем с хранением информации о студентах, посещаемости и платежах в одной базе данных, просто правильно структурируйте свои таблицы.
Хороший аргумент в отношении преждевременной оптимизации - спасибо :) Что касается Laravel, у меня был эпизод с v3, но после переноса моей кодовой базы на v4 мое приложение было похоже на 10-килограммовую улитку ... вялую и невосприимчивую. Вероятно, это была проблема с кешем на моем общем хостинге. В любом случае, Yii отлично работает, когда дело доходит до производительности :)
Laravel может превзойти Yii в некоторых аспектах, но производительность определенно не входит в их число, поэтому предлагать его в качестве замены, когда производительность является проблемой, не имеет большого смысла. :)
«Может ли MySql легко обрабатывать таблицы с> 300 000 строк?» MySQL может легко обрабатывать миллионы записей при правильном индексировании