Определиться со структурой таблицы в mysql базе (php)

12
BasePelleta
На сайте с 29.05.2008
Offline
120
1019

Есть таблица пользвателей для самописного двига

	CREATE TABLE IF NOT EXISTS `bb_user` (

`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(60) NOT NULL DEFAULT '',
`username` varchar(60) NOT NULL DEFAULT '',
`pwd` varchar(32) NOT NULL,
`disabled` tinyint(3) unsigned NOT NULL DEFAULT '0',
`en_exp_modify` tinyint(3) unsigned NOT NULL DEFAULT '0',
`bb_sid` varchar(32) NOT NULL DEFAULT '',
`bb_ads_max` smallint(5) unsigned NOT NULL DEFAULT '0',
`free_ad_used` tinyint(3) unsigned NOT NULL DEFAULT '0',
`lastlogin` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastlogin_ip` varchar(255) NOT NULL DEFAULT '',
`lastlogin_failure` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastlogin_token` varchar(32) NOT NULL DEFAULT '',
`regdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`reg_ip` varchar(30) NOT NULL DEFAULT '',
`exp_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`txn_id` varchar(255) NOT NULL DEFAULT '',
`bb_177_1` varchar(255) NOT NULL DEFAULT '',
`bb_177_2` varchar(255) NOT NULL DEFAULT '',
`bb_177_3` varchar(255) NOT NULL DEFAULT '',
`bb_177_4` varchar(255) NOT NULL DEFAULT '',
`bb_177_5` varchar(255) NOT NULL DEFAULT '',
`bb_177_6` varchar(255) NOT NULL DEFAULT '',
`bb_177_7` varchar(255) NOT NULL DEFAULT '',
`bb_177_9` varchar(255) NOT NULL DEFAULT '',
`bb_177_10` varchar(255) NOT NULL DEFAULT '',
`bb_177_11` varchar(255) NOT NULL DEFAULT '',
`bb_177_12` varchar(255) NOT NULL DEFAULT '',
`bb_177_13` varchar(255) NOT NULL DEFAULT '',
`bb_177_14` varchar(255) NOT NULL DEFAULT '',
`bb_177_15` varchar(255) NOT NULL DEFAULT '',
`bb_status` text NOT NULL,
`images` text NOT NULL,
`bb_ml_list` varchar(255) NOT NULL DEFAULT '',
`bb_af_id` smallint(5) unsigned NOT NULL DEFAULT '0',
`bb_credits` decimal(9,2) NOT NULL DEFAULT '0.00',
`bb_credits_use` char(1) NOT NULL DEFAULT '',
`bb_scart_userinfo` text NOT NULL,
`bb_scart_shipid` varchar(100) NOT NULL DEFAULT '',
`bb_177_16` varchar(255) NOT NULL DEFAULT '',
`bb_177_8` varchar(255) NOT NULL DEFAULT '',
`bb_177_17` varchar(255) NOT NULL DEFAULT '',
`bb_177_18` varchar(255) NOT NULL,
`bb_177_19` varchar(255) NOT NULL,
`bb_opts` text NOT NULL,
`bb_177_20` varchar(255) NOT NULL,
`id_host` int(3) NOT NULL,
`bb_remind` smallint(5) NOT NULL DEFAULT '-1',
`bb_region_id` smallint(5) unsigned NOT NULL,
`bb_pribb_msg_notify` char(1) NOT NULL,
`bb_pribb_msg_reply` char(1) NOT NULL,
`bb_pribb_msg_boxsize` mediumint(8) unsigned NOT NULL,
`int_1` int(11) NOT NULL,
`site_active` int(3) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
UNIQUE KEY `username` (`username`),
KEY `bb_af_id` (`bb_af_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=0 ;

Работа двига организована так, что к этой таблице пользователей идет обращение с 30 сайтов, где

один и тот же пользователь может иметь несколько разных статусов с различным времением их истечения,

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

30 полей `bb_status_1` text NOT NULL, `bb_status_2` text NOT NULL, и т.д.

1. Насколько такая структура таблицы скажется на производительности?

2. Каковы варианты организовать структуру таблицы пользователей по-другому, если для статуса bb_status должен соответствовать отдельный хост (сайт)?

C
На сайте с 28.01.2010
Offline
70
#1

Я бы создал отдельную таблицу для статусов. user_id | site_id | status как-то так.

Это - личная подпись. Здесь обычно ставят ссылки на всякие кривые сайты, надеясь получить "жирный бек".
LEOnidUKG
На сайте с 25.11.2006
Offline
1724
#2

ТС, 1 раз считывайте все статусы и впишите их в сессию или куки, пусть берутся оттуда данные и не надо дёргать БД каждый раз.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
C
На сайте с 28.01.2010
Offline
70
#3
LEOnidUKG:
ТС, 1 раз считывайте все статусы и впишите их в сессию или куки, пусть берутся оттуда данные и не надо дёргать БД каждый раз.

А как же эта, как ее, безопасность? :(

LEOnidUKG
На сайте с 25.11.2006
Offline
1724
#4
Counselor:
А как же эта, как ее, безопасность? :(

Безопасность чего?! Мы тут про ВЫВОД информации, а не про запись. Пусть эти статусы в куках и всё. Сможет поменять из куков? Ну и куда он их поменяет? Для себя родного чтоли? Они же в базу не будут писаться.

C
На сайте с 28.01.2010
Offline
70
#5
LEOnidUKG:
Безопасность чего?! Мы тут про ВЫВОД информации, а не про запись. Пусть эти статусы в куках и всё. Сможет поменять из куков? Ну и куда он их поменяет? Для себя родного чтоли? Они же в базу не будут писаться.

Ну а кто ж его знает что там за статусы. Может там админ/не админ :)

rame0
На сайте с 17.03.2011
Offline
41
#6
Counselor:
Я бы создал отдельную таблицу для статусов. user_id | site_id | status как-то так.

BasePelleta, я бы сделал так же как Counselor

BasePelleta
На сайте с 29.05.2008
Offline
120
#7

Статус пользователя непостоянный, следовательно, нужно будет создать поля: время присвоения статуса, время истечения статуса.

Значит, все-таки отдельная таблица статусов?

На данный мент поле `bb_status` text NOT NULL

имеет записи типа [Journalist-15600045430345], а в выводе имеем статус Journalist, который действительно передается в сессию, что позволяет избежать лишних запросов к базе.

Меня смущает тип поля - text, все-таки varchar 25 обрабатывалось бы быстрее?

В таблице 50.000 пользователей, если кол-во сайтов равно 30, то записей статусов в таблице должно быть 1 500 000, что, на мой взгляд, избыточно, ведь у большинства пользователей статус - Simple, статус Journalist, Profi и т.д. будет только у нескольки сотен пользователей. Какова будет структура в этом случае?

rame0
На сайте с 17.03.2011
Offline
41
#8

BasePelleta, для чего нужно число после названия статуса?

AlexVenga
На сайте с 10.04.2007
Offline
190
#9

Быстрее обрабатывался бы CHAR(25)

Антикризисное предложение: [Бурж, AdSense] [NEW] Сайты - каталоги компаний с гарантией трафа [Дорого] (/ru/forum/1006462)
C
На сайте с 28.01.2010
Offline
70
#10
BasePelleta:
Статус пользователя непостоянный, следовательно, нужно будет создать поля: время присвоения статуса, время истечения статуса.

Значит, все-таки отдельная таблица статусов?

На данный мент поле `bb_status` text NOT NULL
имеет записи типа [Journalist-15600045430345], а в выводе имеем статус Journalist, который действительно передается в сессию, что позволяет избежать лишних запросов к базе.

Меня смущает тип поля - text, все-таки varchar 25 обрабатывалось бы быстрее?

В таблице 50.000 пользователей, если кол-во сайтов равно 30, то записей статусов в таблице должно быть 1 500 000, что, на мой взгляд, избыточно, ведь у большинства пользователей статус - Simple, статус Journalist, Profi и т.д. будет только у нескольки сотен пользователей. Какова будет структура в этом случае?

Ну во-первых нужно заняться нормализацией БД. Т.е. сделать отдельную таблицу всевозможных статусов: status_id | status_text

А в таблицу пользователей записывать только числовое id - это сократит как размер БД, так и увеличит производительность.

А во-вторых если делать отдельную таблицу, в которую будут записываться пользователи и их статусы на разных сайтах, то можно (и нужно) статус по-умолчанию (Simple) туда не заносить, - только отличные от него статусы. И при выборке, если записи нет. присваивать статус по умолчанию. Это сильно сократит размер таблицы с полутора миллионов.

rame0:
BasePelleta, для чего нужно число после названия статуса?

Судя по всему, это время действия статуса.

12

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