Несколько советов от профи (php, mysql)

12 3
R
На сайте с 03.08.2012
Offline
131
1539

Здравствуйте! Есть несколько вопросов, которые очень актуальные для меня.

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

2) Как сделать какой-нибудь общий класс, где будут различные функции, которые часто используются и чтобы все эти функции были доступны во всех других классах? Делать так чтобы этот класс был родителем для всех остальных?

3) На страницу подключать только те классы которые используются на данной страницы, или можно подключить сразу все классы. (их будет 20-30). Просто как я понял, подключение классов на страницы вообще не занимает почти времени для обработки.

4) При проектировании БД, какому принципу лучше придерживаться, больше таблиц но по объему меньше (меньше полей) или наоборот, лучше меньше таблиц, но по объему (полям) больше.

5) На сайте делаю личные сообщения. Личные сообщения хранятся в БД в следующих полях:

id | User_one | User_to | sms | falies | prochitano

Где id - это понятн, User_one - id пользователя который написал сообщение, User_to - это id пользователя которому написали, sms - само сообщение, falies - массив с ссылками на файлы которые прикрипили к сообщению (если имеется) и prochitano - тут значение 0 или 1, 0 это сообщение не прочитано, 1 - прочитано.

Вопрос: вообще нормальная ли такая структура таблицы для личных сообщений. И допустим через пол года в БД личных сообщений будет 1 000 000, будет ли затруднительный поиск по бд через where `user_one`='234234234' AND `user_to`='254534534'?

Буду очень благодарен за ответы на данные вопросы!

Спасибо!

siv1987
На сайте с 02.04.2009
Offline
427
#1

1. Один раз. Разница есть - на открытья соединения тратятся миллисекунды.

2. Статический класс.

3. Зачем все подключать?

4. Принципу реляционности, исходя из своей задачи с учетом расширяемости и поддержки, без избыточности данных.

5. Нормально, только с аттачами стоит еще подумать, и вот это ужасное поле prochitano переименовать. Поиск с учетом индексов будет работать быстро

R
На сайте с 03.08.2012
Offline
131
#2

А как делать соединение один раз правильно? Прописывать в статическом классе, а затем в другом классе в конструкторе соединяться или как? (хотя так если несколько классов будет, будет несколько соединений). Это немного не понятно для меня...

А что не так с аттачами, как лучше сделать?

D
На сайте с 14.01.2007
Offline
153
#3

revered, Соединение к бд делать через Singleton класс. что такое Singleton ищем в гугле

и переименовать falies в files!

O
На сайте с 29.05.2008
Offline
195
#4
revered:
2) Как сделать какой-нибудь общий класс, где будут различные функции, которые часто используются и чтобы все эти функции были доступны во всех других классах? Делать так чтобы этот класс был родителем для всех остальных?

Функции. 🍿

siv1987
На сайте с 02.04.2009
Offline
427
#5

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

O
На сайте с 29.05.2008
Offline
195
#6
revered:
А как делать соединение один раз правильно? Прописывать в статическом классе, а затем в другом классе в конструкторе соединяться или как? (хотя так если несколько классов будет, будет несколько соединений). Это немного не понятно для меня...
А что не так с аттачами, как лучше сделать?

Лично я, использую метод для подключения к базе.

static protected $mysqli;
static function connect() {
self::$mysqli = @new mysqli(Registry::$Conf['DATABASE']['HOST'], Registry::$Conf['DATABASE']['USER'], Registry::$Conf['DATABASE']['PASSWORD'], Registry::$Conf['DATABASE']['NAME'], Registry::$Conf['DATABASE']['PORT']);

if (self::$mysqli->connect_errno > 0)
Error::displayCritical([ 'code' => 'Mysql_connect',
'name' => self::$mysqli->connect_error
]);
else
return true;
}

Где перед хостом указываю префикс "p:", что означает постоянное подключение (соединение удерживается даже после завершения работы скрипта). А в каждом методе, который обращается к базе, проверяю на наличие соединения.


if (isset(self::$mysqli) === false)
self::connect();

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

Z
На сайте с 05.03.2014
Offline
0
#7

siv1987 - все верно говорит, от себя хочу добавить о таблицах. Проектировать их нужно исходя из правил нормальной формы. Если будете придерживаться "Третья нормальная форма" все будет гуд.

D
На сайте с 14.01.2007
Offline
153
#8
ortegas:
@new mysqli

двойной ужос ужос

TF-Studio
На сайте с 17.08.2010
Offline
334
#9

Погуглите singleton + mvc для развития

А потом изучайте Yii

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
D
На сайте с 14.01.2007
Offline
153
#10
TF-Studio:
А потом изучайте Yii

здесь можно долго холиварить;)

12 3

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