Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: SQLite3 оптимизация хранения

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: sqlite3, sqlite, sql, базы данных
tonchikp
Отправлено: 27 Августа, 2017 - 15:07:33
Post Id



Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Дек. 2014  
Откуда: Россия


Помог: 0 раз(а)




Уважаемые форумчане! Требуется ваша помощь!

Есть таблица-словарь SQLite3, где перечисляется что-то (не важно что, суть не в этом)

Ранее создавал так:
CODE (text):
скопировать код в буфер обмена
  1. CREATE TABLE table (
  2.     id INTEGER PRIMARY KEY AUTOINCREMENT,
  3.     obj TEXT UNIQUE
  4. );


Задумался, ведь тут по сути 3 поля с UNIQUE (rowid, id, obj), 2 с AUTOINCREMENT (rowid, id). Получается дублируются роли полей, выполняется возможно ненужная работа, нерациональность. Насколько я понимаю PRIMARY KEY в себе несёт UNIQUE и NOT NULL.

Может лучше так:
CODE (text):
скопировать код в буфер обмена
  1. CREATE TABLE table (
  2.     obj TEXT PRIMARY KEY
  3. ) WITHOUT ROWID;


Подскажите пожалуйста, какие могут быть подводные камни нового подхода? Иными словами, какие минусы?
 
 Top
rgl
Отправлено: 28 Августа, 2017 - 13:53:12
Post Id



Новичок


Покинул форум
Сообщений всего: 56
Дата рег-ции: Авг. 2017  
Откуда: замкадье


Помог: 1 раз(а)




tonchikp пишет:
ведь тут по сути 3 поля с UNIQUE (rowid, id, obj)

ТУТ только 2 поля UNIQUE т.к. rowid и id - два именя для одного и того же поля

Проведем небольшой эксперимент:
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE table1 (id INTEGER PRIMARY KEY AUTOINCREMENT, obj TEXT UNIQUE);
  2. INSERT INTO table1 (obj) VALUES ('aaaaa'),('bbbbb'),('ccccc');
  3. INSERT INTO table1 VALUES (25,'zzzzz');
  4. SELECT rowid,id FROM table1;

получим

как выдно, 1. значения совпадают 2. даже в загловке выдно, что это одно и то же поле (кстати, чтобы включить вывод заголовка в SQLite, дайте команду .header on, по умолчанию заголовки не выводятся)
Продолжим эксперименты, теперь создадим поле без AUTOINCREMENT

CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE table2 (id INTEGER PRIMARY KEY, obj TEXT UNIQUE);
  2. INSERT INTO table2 (obj) VALUES ('aaaaa'),('bbbbb'),('ccccc');
  3. INSERT INTO table2 VALUES (25,'zzzzz');
  4. SELECT rowid,id FROM table2;

Результат в точности тот же, т.е. INTEGER PRIMARY KEY оказывается достаточно.

Попробуем еще поэкспериментировать, заменим INTEGER на INT:
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE table3 (id INT PRIMARY KEY, obj TEXT UNIQUE);
  2. INSERT INTO table3 VALUES (25,'zzzzz');
  3. SELECT rowid,id FROM table3;


Как видим, результат изменился, т.е. теперь id и rowid - два разных поля.

Т.е. резюме, поле rowid создается не всегда иногда это просто другое имя длы уже имеющегося поля. Когда конкретно? Тут есть некая магия, порой противоречащая здравому смыслу, надо просто заучить, либо пробовать и смотреть что получается (как пробовать я показал).
(Добавление)
tonchikp пишет:
Может лучше так:
Чтобы ответить на этот вопрос, нужно посмотреть на всю задачу целиком, а не только на структуру таблицы. Но, (мое скромное ИМХО) скорее всего нет, не лучше. Если поле id нужно, (где-то еще используется) то оставьте как есть. А если не нужно - можно его и убрать, физически таблица останется точно такая же. Но неявное поле rowid по умолчанию заводится не случайно, так в данной конкретной СУБД опримизированы индексы, что с ним лучше. Не претендую на истину в последней инстанции.

(Отредактировано автором: 28 Августа, 2017 - 14:05:43)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB