Тупой вопрос по базам
От: Hоmunculus  
Дата: 22.08.25 09:43
Оценка:
Есть массив чисел. Он загружается из базы. ВСЕ числа в программе как-то меняются и потом сохраняется назад в базу.

Как эффективнее — ввести ключ и потом каждое значение по ключу перезаписывать или просто тупо при каждом сохранении все в базе очищать и заново просто ее заполнять?
Re: Тупой вопрос по базам
От: m2user  
Дата: 22.08.25 09:59
Оценка: 2 (1)
> ввести ключ и потом каждое значение по ключу перезаписывать

при вставке будет проверка constraints (уникальность ключа и пр.) и пересчет индекса, что снизит скорость заполнения

> или просто тупо при каждом сохранении все в базе очищать и заново просто ее заполнять?


Удалить БД (или таблицу), а потом заполнить через bulk insert (или его аналог в той БД, что ты используешь) эффективнее.
Только для небольшой таблицы (массив чисел) выигрыш может быть несущественным.
Re[2]: Тупой вопрос по базам
От: DiPaolo Россия  
Дата: 22.08.25 11:17
Оценка: +1
M>при вставке будет проверка constraints (уникальность ключа и пр.) и пересчет индекса, что снизит скорость заполнения

M>Удалить БД (или таблицу), а потом заполнить через bulk insert (или его аналог в той БД, что ты используешь) эффективнее.

M>Только для небольшой таблицы (массив чисел) выигрыш может быть несущественным.

Так смотря какой тип базы. Key-value, например, для того ведь и сделаны – обновлять по ключу. Так что то что выше верно для "обычных" реляционных ну и наверное NoSQL общепринятых.
Патриот здравого смысла
Re: Тупой вопрос по базам
От: Stanislav V. Zudin Россия  
Дата: 22.08.25 12:01
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

H>Есть массив чисел. Он загружается из базы. ВСЕ числа в программе как-то меняются и потом сохраняется назад в базу.


H>Как эффективнее — ввести ключ и потом каждое значение по ключу перезаписывать или просто тупо при каждом сохранении все в базе очищать и заново просто ее заполнять?


Встречные вопросы:
У чисел есть какой-то ключ (положение в массиве или что-то другое)? Их нужно искать по какому-то критерию? Ну, т.е. надо ли для каждого числа создавать отдельную запись в бд? Может можно обойтись блобом? А может и вовсе без бд?
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: Тупой вопрос по базам
От: Hоmunculus  
Дата: 22.08.25 12:41
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

Просто массив чисел. Без всяких ключей. Надо с базой.
Просто массив — это все равно таблица? В таблице ключ обязателен? Или можно для одномерного массива вообще не таблицу? (Если что в массиве могут быть повторяющиеся числа, так что сделать сами числа ключами не прокатит)
Re[3]: Тупой вопрос по базам
От: Stanislav V. Zudin Россия  
Дата: 22.08.25 12:59
Оценка: 2 (1) +3
Здравствуйте, Hоmunculus, Вы писали:

H>Просто массив чисел. Без всяких ключей. Надо с базой.

H>Просто массив — это все равно таблица? В таблице ключ обязателен? Или можно для одномерного массива вообще не таблицу? (Если что в массиве могут быть повторяющиеся числа, так что сделать сами числа ключами не прокатит)

Если ты не собираешься делать какие-то манипуляции с отдельными числами — выбирать их по какому-то критерию, использовать при поиске других данных, строить зависимости от этих чисел, то дешевле будет положить весь массив в одно поле.
Грубо говоря, будет в СУБД таблица из одного столбца с единственной записью.

Как-то так (зависит от используемой субд):
CREATE TABLE MY_PRECIOUS_DATA (
  MY_ARRAY_OF_SMTH    text
)


Из неё вычитывается весь массив за один вызов.
И так же сохраняется.

Только СУБД в таком сценарии избыточна. Но коли на бд всё завязано, то почему бы и нет.
Использовали такое решение.
_____________________
С уважением,
Stanislav V. Zudin
Re: Тупой вопрос по базам
От: paucity  
Дата: 24.08.25 00:56
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

На работу устроился
Автор: Hоmunculus
Дата: 18.08 19:14
?
Re[3]: Тупой вопрос по базам
От: paucity  
Дата: 24.08.25 01:13
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

H>Просто массив чисел. Без всяких ключей. Надо с базой.


У некотрых СУБД есть поддержка массивов аля Array Data Type

Есть несколько Array DBMS

H>В таблице ключ обязателен?


В принципе нет, но тогда не должно быть повторяющихся строк.

Таблица с одним столбцом и значениями:
1
55
1
33
22
22
не будет работать.

Таблица:
1 | 55
22 | 33
1| 55
тоже не прокатит.

Таблица, где первый столбец авто генерируемый ключ:
1 | 1 | 55
2 | 22 | 33
3 | 1| 55
прокатит.
Re[4]: Тупой вопрос по базам
От: Hоmunculus  
Дата: 24.08.25 02:04
Оценка: +1
Здравствуйте, paucity, Вы писали:

P>Таблица с одним столбцом и значениями:

P>1
P>55
P>1
P>33
P>22
P>22
P>не будет работать.

В смысле? Почему? Я сделал уже. Работает
Re[2]: Тупой вопрос по базам
От: Hоmunculus  
Дата: 24.08.25 02:06
Оценка:
Здравствуйте, paucity, Вы писали:

P>Здравствуйте, Hоmunculus, Вы писали:


P>На работу устроился
Автор: Hоmunculus
Дата: 18.08 19:14
?


Да. А там базы данных используются. Ничего сложного вроде, но последний раз с ними на фокспро в универе работал. Вот, вспоминаю
Re[5]: Тупой вопрос по базам
От: paucity  
Дата: 24.08.25 04:45
Оценка:
Здравствуйте, Hоmunculus, Вы писали:

P>>Таблица с одним столбцом и значениями:

P>>1 ----- ??
P>>55
P>>1 ----- ??
P>>33
P>>22 ---- ?
P>>22 ---- ?
P>>не будет работать.

H>В смысле? Почему? Я сделал уже. Работает


Как оно, без дополнительного ключа, строки с одинаковыми значениями "различает"? Что за субд такая интересная?
Re[6]: Тупой вопрос по базам
От: m2user  
Дата: 24.08.25 05:42
Оценка: 1 (1)
P>Как оно, без дополнительного ключа, строки с одинаковыми значениями "различает"? Что за субд такая интересная?

Это же просто колонка (без требования на уникальность значений).
И таблица без primary key.
(БД строки конечно различает по каким-то своим внутренним rowid).
Re[6]: Тупой вопрос по базам
От: Hоmunculus  
Дата: 24.08.25 05:44
Оценка:
Здравствуйте, paucity, Вы писали:

P>Здравствуйте, Hоmunculus, Вы писали:


P>>>Таблица с одним столбцом и значениями:

P>>>1 ----- ??
P>>>55
P>>>1 ----- ??
P>>>33
P>>>22 ---- ?
P>>>22 ---- ?
P>>>не будет работать.

H>>В смысле? Почему? Я сделал уже. Работает


P>Как оно, без дополнительного ключа, строки с одинаковыми значениями "различает"? Что за субд такая интересная?


Sqllite
Re[7]: Тупой вопрос по базам
От: paucity  
Дата: 25.08.25 13:30
Оценка:
Здравствуйте, m2user, Вы писали:

M>Это же просто колонка (без требования на уникальность значений).


Возможно запамятовал, но вроде было время, когда СУБД "требовали" уникальность строк в таблице без PK (независимо сколько колонок)

Сейчас в онлайн песочницах попробовал, да работает и в sqlite, и в "серьезных" субд

M>(БД строки конечно различает по каким-то своим внутренним rowid).
Re[5]: Тупой вопрос по базам
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.08.25 08:26
Оценка: 7 (2)
Здравствуйте, Hоmunculus, Вы писали:

H>В смысле? Почему? Я сделал уже. Работает

По вашему описанию непонятно, что именно должно работать.
В реляционной алгебре кортежи обязательно должны быть попарно различны (по чисто академическим причинам), и у них нет понятия "порядка".
В SQL используется немножко другая алгебра, поэтому требования иметь уникальный ключ в таблице нету.
Но обычно под термином "массив" имеется в виду упорядоченный набор неуникальных значений.
А в SQL без order by порядок записей ничем не гарантирован.
Если вас не пугает перспектива записать [1, 7, 1], а потом прочитать [1, 1, 7] — то, может быть, всё и "работает".
А если пугает — то "работает" всё только потому, что вы заложились на implementation specifics, которое может сломаться в любой момент без уведомления.

Если не секрет — зачем вам реляционка? Какие именно свойства РСУБД вам потребовались, которые не получилось обеспечить банальной сериализацией массива в обычный файл?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Тупой вопрос по базам
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.08.25 08:31
Оценка: 6 (1)
Здравствуйте, Hоmunculus, Вы писали:

H>Есть массив чисел. Он загружается из базы. ВСЕ числа в программе как-то меняются и потом сохраняется назад в базу.


H>Как эффективнее — ввести ключ и потом каждое значение по ключу перезаписывать или просто тупо при каждом сохранении все в базе очищать и заново просто ее заполнять?

0. Зависит от конкретной СУБД.
1. В среднем, перезапись по ключу немножко менее эффективна, чем truncate, а потом вставка балком (потому, что truncate не журналируется).
2. Delete без условия, а потом insert — в среднем немножко менее эффективно, чем серия update
3. Как уже подсказали, если прямо не терпится использовать именно СУБД (например, по соображениям атомарности изменений), лучше такой массив хранить в виде одного поля одной записи. И чем компактнее — тем лучше.
В частности, если числа у вас фиксированной разрядности (и endianness при чтении и записи гарантированно не меняется), то лучше хранить его в виде BLOB (а не в виде, скажем, строки разделённых запятыми десятичных представлений).
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.