LINUX.ORG.RU
ФорумTalks

key-value VS table

 


0

2

Щас не будет речи про mysql, postgres и т.п. B про какие-либо реляции не будет - то есть, отношения между таблицами не волнуют. Не волнуют и транзакции.

Вот предположим у вас есть хранилка key=value. Казалось бы, в такую хранилку можно упихать примерно всё и выразить через кучу key-value любые данные и схемы и я даже знаю как на двух redis в разных кусках планеты бабки между клиентами атомарно переводить без блокчейна (CAS только прикрутить к key-value хранилке, но это примитивно делается). Это всё не ново и понятно.

А теперь предположим, что у вас есть хранилка табличек. В ней можно:

  1. Создать табличку со статически типизированной строгой схемой, т.е. задать набор колонок с фиксированными типами (string, int, float и т.п.).
  2. Добавлять/удалять колонки.
  3. Апгрейдить типы (sting на int поменять и хранилка сама скастит все числа из строк в инты, например).
  4. Хранить широкие строки (с кучей колонок), а выбирать только нужные.
  5. Замутить нижний слой хранения колоночный, тогда выбор отдельных колонок будет оптимизирован, а полная строка выбираться медленнее ну и пофиг.

Хотелось бы получить некий формальный список возможностей, которые даёт такой табличный вид.

Про реляции, джойны, транзакции мы тут не говорим, они сами по себе к таблицам никакого отношения не имеют и тут не интересны. SQL тоже ни при чём, в таблицу вы можете ходить по самодельному бинарному протоколу любой степени жопности, так же как и в key-value хранилку ходить через SQL (select from A value where key = K).

Например:

  1. Можно добиться компактности, если числа больше 999 хранить в инте, а не в строке.
  2. Статической типизацией колонок можно несколько ограничивать разнообразие бреда.
  3. Ненужные колонки можно целиком выкинуть (за разную цену в row и column движках хранения конечно, но можно) или добавить новые. Хотя в key-value можно тоже перестать пейсать какое-то поле в json или начать его пейсать, подготовив код к факту наличия этого поля.
  4. Великая мудрость о том, что хранение json-ов - признак дебилов, поскольку в итоге набор и типы полей в объектах достаточно фиксированы и если вы схему не зафиксировали в хранилке, то вы чёрт обоссаный наверное, который вечно живёт на временном решении - всё ещё продолжает выполняться.
  5. Если создать таблицу (key : string, value : string), то можно этим частным случаем таблицы поглотить всю предметную область key-value сразу целиком. Работать будет за то же время. Физически хранить это в памяти или на диске можно в итоге точно так же. Это позволит унифицировать доступ к key-value и к другого типа данным через одну хрень.
  6. Если в одной и той же key-value хранилке два разных отдела пытаются хранить свою инфу, то им придётся отделяться друг от друга некими «префиксами» у ключей: ключ «sobaka» у разных отделов будет выглядеть так: department1.sobaka=123, department2.sobaka=551, в итоге всё хранилище засрано этими префиксами, хотя решение тупое и надо просто поднять два разных редиса под такое, но всё-таки. А в случае табличек это просто две разные таблички, которые лежат компактнее, т.к. не надо хранить префиксы в каждой записи. Да, можно в случае key-value сжать рядом лежащие ключи по префиксам.
  7. Можно пилить разные интересные индексы: например по какой-то десятой int-колонке создать индекс, который упорядочивает все записи по ней и потом быстрее выбирать. А в случае key-value это надо будет те же данные налить в нужном порядке в другое хранилище и потом ещё следить за согласованностью двух.

В общем, хочется подобной фигни почитать. Чисто на уровне системы хранения, без отсылок к каким-то там продуктам уровня postgres. И это не тред о том, что мне взять - redis или postgres, речь о фундаментальных различиях в возможностях key-value и табличек.

Документ-ориентированную хрень не рассматриваю, это какой-то лютый треш и содомия, да - люди пытались улучшить key-value для рукожопов, не осиливших постгрес.

хочется подобной фигни

Звучит как, что не хочу разбираться в существующих архитектурах, поэтому придумал ещё одну, как бы оправдать её существование.

Ну, как-то не очень. Может сначала придумать «чтобы что» и под это придумывать реализацию?

vvn_black ★★★★★
()

почитать

На памяти вот такое Меджедович, Тахирович «Алгоритмы и структуры данных для массивных наборов данных».

vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

Звучит как, что не хочу разбираться в существующих архитектурах, поэтому придумал ещё одну, как бы оправдать её существование.

Не понял о чём речь.

lesopilorama
() автор топика
Ответ на: комментарий от lesopilorama

Не понял о чём речь.

О подходе.

Может сначала придумать «чтобы что» и под это придумывать реализацию?

Так же проще?

vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

Так же проще?

Я не понял что вы хотите и зачем и что пытаетесь упростить. Никаких практических задач в треде нет, он академический, протирательный штаны в НИИ. Для гениев, в общем.

lesopilorama
() автор топика
Последнее исправление: lesopilorama (всего исправлений: 3)

Записаться на курсы разработчиков БД или DBA ?

sanyo1234
()

Почитай исходники кликхауса

cobold ★★★★★
()

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

Таблицы позволяют использовать для доступа к данным SQL, за которым стоит математика с реляционной теорией. По сути таблицы это такой шаблон фасад для SQL.

shimshimshim
()
Последнее исправление: shimshimshim (всего исправлений: 3)
Ответ на: комментарий от shimshimshim

Нет схемы значит это не данные а говно

Программист: Я программист!
Анонимус: А по-моему, ты говно!

(тм)

Есть ещё такая штука, как triple store, где единица хранения — кортеж из имени атрибута, его значения и сущности, которой принадлежит атрибут (ну и опционально информация о транзакции). Поддерживает структурированный язык запросов.

Как тебе такое, Илон Маск?

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от Nervous

По сути та же таблица если известна схема, и говно если схема неизвестна и э триплеты каждый раз с новыми именами. Такой себе гибрид колоночной и табличной БД, наверно позволяющий лучше сжимать повторяющиеся данные. И делать каждую колонку индексом. Чем еще это отличается от таблиц?

Вот кстати наверняка же есть какие-то закономерности при изменении этих данных, наверняка должны быть некие наборы триплетов которые почти всегда читаются и пишутся одновременно? Может быть их имеет смысл хранить рядом друг с другом, чтобы считывать их с диска одной операцией, пожертвовать компрессией в пользу скорости?

shimshimshim
()
Последнее исправление: shimshimshim (всего исправлений: 2)

Я бы отрывал лапки всем, кто внедряет в БД какую-либо логику сложнее «получить все данные из таблицы по полю».

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

Дидовские программы 70хх годов ориентируют антенны по звездам и шлют массивы снимков за миллиарды километров от Земли, а этим на 20 SELECT'ов нужны 4Гб VPS.

windows10 ★★★★★
()

Не проще ли сразу mongoDb и там хранить что душа пожелает?

grim ★★☆☆
()
Ответ на: комментарий от windows10

Думаете будет проще прддеривать сотню сток на «языке высокого уровня» чем пять строчек SQL или МонгоДБ?

grim ★★☆☆
()
Ответ на: комментарий от windows10

Ловите конченого!

Я бы отрывал лапки всем, кто накручивает десятки абстракций и высокоуровневых orm вместо использования встроенной логики бд, гарантирующей формальность, строгость, самоконтроль и аудит.

Дидовские программы 70хх годов ориентируют антенны по звездам и шлют массивы снимков за миллиарды километров от Земли, а этим на 20 SELECT’ов нужны 16Гб VPS.

Anoxemian ★★★★★
()
Ответ на: комментарий от grim

Думаете будет проще прддеривать сотню сток на «языке высокого уровня» чем пять строчек SQL или МонгоДБ?

Это не 5 строчек, это десятки тысяч строк занимающего место кода.

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

Более того, язык высокого уровня позволяет хранить в памяти результаты запроса чтобы использовать их в других запросах без дергания БД по сотне раз.

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

windows10 ★★★★★
()

у разных отделов будет выглядеть так: department1.sobaka=123, department2.sobaka=551, в итоге всё хранилище засрано этими префиксами, хотя решение тупое и надо просто поднять два разных редиса под такое, но всё-таки. А в случае табличек это просто две разные таблички, которые лежат компактнее, т.к. не надо хранить префиксы в каждой записи

Ну нет же. Это будет одна табличка с тремя полями. В первом department, во втором - имя объекта, в третьем - значение. Разве не так?

Xintrea ★★★★★
()

Вот предположим у вас есть хранилка key=value. Казалось бы, в такую хранилку можно упихать примерно всё

Да. Ты изобрёл ОЗУ.

Хотелось бы получить некий формальный список возможностей, которые даёт такой табличный вид.

Практически, безграничный список возможностей. Как в ОЗУ. Что напрограммируешь - то и будет.

tiinn ★★★★★
()
Ответ на: комментарий от windows10

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

Действительно. Вот есть у нас небольшая табличка на несколько миллионов записей. Мы берём все эти миллионы записей, гоним на сторону ЯВУ, где уже фильтруем, сортируем и прочие задротства делаем. Гениально. А уж какая скорость работы нам будет обеспечена. Особенно, если хостить программу и БД на разных серверах.

Дидовские программы 70хх годов ориентируют антенны по звездам и шлют массивы снимков за миллиарды километров от Земли, а этим на 20 SELECT’ов нужны 4Гб VPS.

Ну так ты сведи работу с БД к передаче потока байтиков и не надо будет тебе СУБД в принципе.

skiminok1986 ★★★★★
()
Ответ на: комментарий от windows10

Более того, язык высокого уровня позволяет хранить в памяти результаты запроса чтобы использовать их в других запросах без дергания БД по сотне раз.

Ну так кэшировать результаты запроса это нормально. При этом не обязательно даже в памяти. При чём тут отказ от скорости и простоты SQL в пользу изобретения велосипедов?

skiminok1986 ★★★★★
()
Ответ на: комментарий от windows10

Мой опыт показываете что SQL и Mongo запросы значительно упрощают код на «языке высокого уровня»

Ктсти, SQL это язык более высокого уровня, чем к примеру, Java ;)

Более того, язык высокого уровня позволяет хранить в памяти результаты запроса чтобы использовать их в других запросах без дергания БД по сотне раз.

А ктото запрещает вам это желать при работе с результатами SQL запросов?

grim ★★☆☆
()
Последнее исправление: grim (всего исправлений: 1)
Ответ на: комментарий от skiminok1986

Действительно. Вот есть у нас небольшая табличка на несколько миллионов записей. Мы берём все эти миллионы записей, гоним на сторону ЯВУ, где уже фильтруем, сортируем и прочие задротства делаем. Гениально. А уж какая скорость работы нам будет обеспечена.

Именно. Это я и делал на PHP и даже замерял скорость. Есть данные. Миллион записей. Задача - отсортировать их по дате добавления, timestamp иными словами.

MySQL: создал таблицу с двумя полями, int и varchar. SELECT * from varchar where int > 12345678 and int < 87654321 and varchar LIKE '%test%'; Простой запрос

PHP: создал таблицу с одним полем varchar и содержимым в формате «timestamp;value» - как CSV типа. SELECT * from varchar; Затем цикл от с explode и двумя условиями: if (($array[0]>12345678)and($array[0]<87654321)) и if (substr_count($array[1],'test')>0) {echo $array[1]. "\n";}

Выполнялось это все разумеется на RPI2, чтобы была заметна разница в производительности. Без кеширований и прочих читерств. PHP выполнил вывод почти вполовину быстрее, там что-то кажется 12 сек против 21.

windows10 ★★★★★
()
Ответ на: комментарий от grim

Мой опыт показываете что SQL и Mongo запросы значительно упрощают код на «языке высокого уровня»

Я не об упрощении, я о скорости выполнения.

А ктото запрещает вам это желать при работе с результатами SQL запросов?

Мой коммент не об этом, а об ресурсах и скорости.

Но таки да, я в своих жрущих проектах для пары клиентов именно так и делал. Жрущий - это около 10к запросов в секунду. Чатик в общем говоря. Само собой существующие stand-alone решения гнутся на таком количестве, либо требуют очень жирные конфигурации. И как ни странно большая часть нагрузки идет на mysql.

Пришлось немного видоизменить логику, избавиться от JOINов, GROUP BY, хитрожопых фильтров, и переложить это на скриптоту. Стало весело и быстро.

windows10 ★★★★★
()

B про какие-либо реляции не будет - то есть, отношения между таблицами не волнуют

Для начала

buddhist ★★★★★
()

B про какие-либо реляции не будет - то есть, отношения между таблицами не волнуют

Вас в шараге не учат, что слово «relational» в «relational database» не имеет отношения к отношениям между таблицами?

buddhist ★★★★★
()
Ответ на: комментарий от windows10

Какой-то игрушечный пример. У меня таблица с информацией о заказах 25 гиг. Как-то грустно это грузить в память для выборки за каждым разом, например.

skiminok1986 ★★★★★
()
Ответ на: комментарий от windows10

Есть данные. Миллион записей

Так это мало. Вся суть СУБД в управлении данными, которые не влезают в память. Для этого там индексы и прочие извороты.

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

no-such-file ★★★★★
()
Ответ на: комментарий от windows10

С одной стороны поддержу, что всё сложнее select, join, merge обычно хочется сделать на более другом языке. С другой - до совсем уж select * from table лучше не опускаться. Как правильно заметили, случится ой, как только размер базы превысит размер ОЗУ.

yu-boot ★★★★
()
Ответ на: комментарий от shimshimshim

В этом посте немного каша.

  1. Таблицы могут быть и без реляций.
  2. SQL может быть и без таблиц, таблицы могут быть без SQL

Недостаточно фундаментальный пост!

lesopilorama
() автор топика
Ответ на: комментарий от windows10

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

Не получается. Объясню на пальцах. Предположим, у тебя есть 10102030120301923 млрд записей в таблице. Они как-то лежат на диске. Вот то, как они лежат, очень сильно определяет скорость поиска конкретной строки по какому-то полю. Грубо говоря, если содержимое какой-либо колонки кореллирует с тем, как записи лежат относительно друг друга, то ты можешь искать в этих данных по этой колонке, если нет, то не можешь. Например есть таблица с колонками (А, B, C). Строки в этой таблице физически как лежат? Например отсортированно по (А). Тогда ты можешь каким-то (бинпоиском хотя-бы) алгоритмом искать что-то по А, потому что ткнув в серединную строку и посмотрев на её значение А можешь понять - тебе надо двигаться назад или вперёд при поиске. При сортировке строк по А, строки будут отсортированы по остальным полям ровно НИКАК от слова СОВСЕМ и найти по какому-то другому полю ты физически их сможешь только полным перебором, что полная жопа. Хочется быстрее. Хочется ткнуть в диск как можно меньшее число раз при каком-либо поиске. Даже если всё загрузить в память, то перебирать всю память - жопа отвалится. Это и есть ИНДЕКСЫ. Индекс - определённый порядок сортировки одних и тех же строк.

Дидовские программы 70хх годов ориентируют антенны по звездам и шлют массивы снимков за миллиарды километров от Земли, а этим на 20 SELECT’ов нужны 4Гб VPS.

Дидовские программы вполне себе как раз дружили со всей этой дичью - индексами, алгоритмами, структурами данных на внешней памяти: Дональд Кнут на этой теме себе имя сделал: ленты, сортировки, массивы - всё это было дико важно: объёмы данных были конские, процы были медленные, а находить отдельную запись за пикосекунду хотели уже тогда.

lesopilorama
() автор топика
Последнее исправление: lesopilorama (всего исправлений: 2)
Ответ на: комментарий от windows10

Проблема в том, что если ты не запихаешь СТРАШНУЮ ЛОГИКУ в саму СУБД, то твоему коду придётся сделать столько доступов к памяти (какой бы она ни была: DDR4 или SATA диск), что тебя на кол посадят и со всей дури кочергой по морде отметелят за такие тормоза и насилие над ресурсами. В этом смысл: сделать как можно меньше доступов.

lesopilorama
() автор топика

Почитал тред. Надо признать, что все высказавшиеся достаточно тупенькие ребятки в данном вопросике, видимо лор слегонца поддеградинькал за последнее время или все на войну свалили. Школота какая-то. Сказал же, что реляции не интересны, а слово «реляционка» всё равно прёт. При этом человек слабо себе представляет что это такое! Лупить мои серые костыли трупом Макаревича!

lesopilorama
() автор топика
Ответ на: комментарий от skiminok1986

Какой-то игрушечный пример. У меня таблица с информацией о заказах 25 гиг. Как-то грустно это грузить в память для выборки за каждым разом, например.

И «выборку» придётся запрогроммировывать руками, переизобретая кодик, который в СУБД написан уже. Выбрал в память 25 гигов, пересортировал их по нужным тебе кортежам в ПХП, поискал, отдал юзеру! Красота!

lesopilorama
() автор топика
Ответ на: комментарий от windows10

Какой-то наркоманский мир, в котором ты живёшь. MySQL - какая, на каком движке? Индекс какой? Если взять какую-нибудь рандомную mariadb / innodb, сказать что primary index у нас по int, то твой запрос дольше МИКРОСЕКУНДЫ занимать не может. Проверено, запруфано, графики нарисованы сто раз. Жесть, что вы делаете целые секунды всего в ляме записей. В ГЛАЗНИЦЫ ДОЛБИТЕСЬ, В НОСУ ГРАБЛЯМИ КОВЫРЯЕТЕСЬ, я понял.

lesopilorama
() автор топика

ГОСПОДА, ещё раз: тред вообще ни про какие mysql, postgres, clickhouse - это раз. Он чисто про структуры данных и алгоритмы в вакууме по Кнуту.

Таблицу рассматривайте пожалуйста как массив строк, где строка - последовательность значений колонок: например для таблицы со схемой (a : int, b : int) наша таблица может лежать в памяти просто как (1, 2), (500, 100), …, (14, 134) в бинарном виде (каждая строка - 4 + 4 байтика. Всё!

Упомянутые в посте таблицы никакого отношения к чему-либо с корнем «relat» не имеют. Ни о каких ОТНОШЕНИЯХ речи нет.

Под key-value хранилкой пожалуйста подразумевайте просто std::unordered_map<std::string, std::string> или даже B+-Tree дерево в памяти, с прикрученным к нему самодельным сетевым протоколом и больше ничего.

lesopilorama
() автор топика
Ответ на: комментарий от windows10

Я не об упрощении, я о скорости выполнения.

И ускоряют.

Когда вместо 2-3 запросов к БД и пары десятков строк на Java/C#/TS вы пишете несколько строк на SQL/mongo то ваш код будет работать быстрее, так как все ORM которые я видел не уменьшают количество запросов к БД а увеличивают.

А 2 запроса медленнее одного ~ в 2 раза :)

Мой коммент не об этом, а об ресурсах и скорости.

Мой тоже.

Пришлось немного видоизменить логику, избавиться от JOINов, GROUP BY, хитрожопых фильтров, и переложить это на скриптоту. Стало весело и быстро.

Верю, что существуют ситуации, связанные с плохим проектированием, когда нужно убирать SQL и переводить на «скриптоту» но никогда с таким не сталкивался.

grim ★★☆☆
()
Ответ на: комментарий от lesopilorama

Жесть, что вы делаете целые секунды всего в ляме записей

Есть у меня запросы с кучкой подзапросов и десятком джинов. На скромных нескольких лямах записей может выполняться десятки секунд. Но это статистика всё, нужна раз в месяц и оптимизирована почти до упора уже.

skiminok1986 ★★★★★
()
Ответ на: комментарий от windows10

Ну, идея то в том, чтобы не данные из БД уходили, а результаты. Быстрее БД операцию сортировки сложно выполнить - придется знать статистику распределения этих данных, знать какую часть держать в ОЗУ а какую на диске (построить стратегию инмемори), научиться быстро читать с диска (бд иногда работает с диском в обход ОС). Ну и написать это всё на С. Как говорится: «И получится своя БД, только плохая». А логику написать на верхнеуровневом PL/SQL :)

Paka_RD
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)