Добрый день. Впервые изучаю базы данных, скопилось не мало вопросов, скорее всего довольно глупых, но тем не менее, для общей ясности картины хотелось бы их уточнить, что бы двигаться дальше.
1.
`id` int(11) NOT NULL AUTO_INCREMENT,
Если поле инкрементное, то, как я понимаю можно и не указывать ему
NOT NULL
ибо оно и так не будет пустым никогда, верно?
2.
`bonus_count` int(11) NOT NULL DEFAULT '0',
Точно так же и здесь, если есть дефолтное значение, то указывать
NOT NULL
необязательно, верно?
3.
PRIMARY KEY,
Первичный ключ, как я понимаю это поле не должно быть пустым и обязано быть уникальным, но надо ли обязательно указывать эти параметры для этого поля с первичном ключом? Или оно по умолчанию примит такие параметры и не даст создать запись дубликат или пустое значение?
4. Есть ли смысл для поля ID(уникальное, первичный ключ) указывать ему
unsigned
, вопрос риторический наверное, в базе вряд ли будет больше 2 млрд значения поля ID именно для CS.
5.
ENGINE=InnoDB
Не совсем понял, что это за параметр такой, стоит ли указывать его для работы с sqlite
6.
DEFAULT CHARSET=utf8,
Как я понимаю, в наше время использовать такую кодировку желательно, для работы, даже, с теме же русскими никнеймами.
7.
AUTO_INCREMENT=1
По дефолту отсчет идет с нуля, как я понимаю?
8.
INDEX (`steamid`)
Обязательно ли индексировать поле, реально ли увеличивается поиск по этому полю?
9. Обязательно ли подключаться к базе данных
SQL_Connect
при инициализации плагина, говорят так будет эффективнее работать с базой на протяжении всей карты. Но, если я не подключусь к ней, а выполню простой запрос, подключение к базе ведь выполниться автоматически, как я понимаю? И подключение так и будет висеть до конца карты или пока я сам не закрою его.
C++:
public plugin_cfg() {
if(!file_exists(STATS_DATABASE_DIR)) {
new iFileID = fopen(STATS_DATABASE_DIR, "a");
fclose(iFileID);
}
SQL_SetAffinity("sqlite");
g_SQLTuple = SQL_MakeDbTuple("", "", "", STATS_DATABASE_DIR);
formatex(g_SQLQuery, charsmax(g_SQLQuery),
"CREATE TABLE IF NOT EXISTS `stats`( \
ID INTEGER AUTO_INCREMENT, \
AuthID TEXT PRIMARY KEY, \
Name TEXT NOT NULL, \
Frags INTEGER DEFAULT '0', \
Deaths INTEGER DEFAULT '0')"
);
SQL_ThreadQuery(g_SQLTuple, "QueryHandleCreate", g_SQLQuery);
}
Подключения не производил, но запрос выполнился, получается подключение произвелось автоматически, но вопрос только в том, останется ли висеть это подключение или будет закрываться автоматически после каждого запроса, если да, то будет правильнее подключиться сразу при инициализации плагина и держать открытым это подключение.
10. После смены карты, подключение к базе данных закрывается автоматически или желательно закрывать его вручную
C++:
g_SQLTuple = SQL_MakeDbTuple("", "", "", STATS_DATABASE_DIR);
g_SQLConnect = SQL_Connect(g_SQLTuple, i_ErrNo, s_Error, charsmax(s_Error))
public plugin_end() {
SQL_FreeHandle(g_SQLConnect )
SQL_FreeHandle(g_SQLTuple )
}
11. Тоже самое касается запросов, как я понимаю, после выполнение запроса он будет висеть до тех пор, пока не закроешь сам, то есть желательно перед новым запросом закрыть старый
SQL_FreeHandle(Query)
или я не прав? И еще вопрос касаемо завершение карты, запрос закроется автоматически или тоже желательно его закрывать
C++:
public plugin_end() {
SQL_FreeHandle(Query)
}