Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi и базы данных
Войти
Регистрация
Восстановить пароль
 
Shakielpel
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 244
#1

Как лучше организовать хранение и доступ к данным? - Delphi БД

22.09.2014, 06:03. Просмотров 571. Ответов 17
Метки нет (Все метки)

На текущий момент есть набор таблиц TClientDataSet, которые не подключаются ни к какой базе данных. Т.е. то что в них заполняют просто сохраняется на диск в виде файлов. При начале работы приложения эти данные загружаются в память. Причем во время работы приложения обращение к данным таблицам не происходит постоянно. По данным таблицы создаются объекты классов которые и используются в процессе работы программы (т.е. когда все объекты созданы, база просто занимает память). Объект класса создается в момент его первого вызова, т.е. если в процессе работы программы какой то объект долгое время не вызывается, то и объект этого класса создан не будет, а это значит, что обращение к базе может произойти не только при запуске программы, но и очень потом, причем неизвестно когда, в том числе и вообще никогда.

Задача: Хранить данные базы данных на удаленном сервере в интернете. На сервере есть FTP,MySQL, Apache. (хотя это может быть любой хостинг/сервер который продают в инете, предложения также приветствуются)

Варианты которые я вижу:

1) Хранить файлы, которые ныне хранятся локально на фтп и при старте программы скачивать их и загружать в программу. Проблема: эти файлы не должны сохраняться на локальном жестком диске пользователя, как бы этого достичь? Как сделать так, чтобы скачивать могли лишь те кто получил на это разрешение, а не все подряд кто знает по какому адресу лежат эти файлы(защита фтп паролем не вариант, сегодня ему можно качать, а завтра уже нельзя. Но программа которая будет качать написана мной). Опять же, если узнать пароль к фтп, то можно стырить все базы сторонней программой, что есть катастрофа.


Второй вариант для меня темный лес, я даже не знаю возможно ли это, но:

2) Хранить данные в MySQL и: выдавать их при запросе конкретного объекта? или при старте загружать сразу все таблицы?
Проблема: Количество баз MySQL на сервере очень ограничено, а количество наборов таблиц, которые необходимо хранить как раз таки ничем не ограничено. Значит все наборы нужно хранить в одной базе, как бы это вообще организовать. Та же проблема с доступом - т.е. сначала клиент должен получить подтверждение, что имеет право получать эти данные, а уж потом получать их. Что если таких наборов будет 1000+ как это все будет выживать?

Каким путем пойти? и как к этому подступиться(если с первым вариантом более менее понятно, то со вторым нет)?
Какие еще есть советы, идеи, предложения?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2014, 06:03
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как лучше организовать хранение и доступ к данным? (Delphi БД):

Как лучше организовать хранение данных?
Всем доброго времени суток. Есть необходимость хранения в базе 500 чисел....

Как получить доступ к данным
Подскажите пожалуйста как получить доступ к полученой таблице после SQL-запроса...

Как получить доступ к данным в ADODataSet (или ADOQuery)?
Добрый день. Не могу понять, как получить доступ к конкретной ячейке...

Как лучше организовать журнал накладных
Приветствую товарищи :) Есть программа. В ней нужно реализовать журнал...

Как лучше организовать проверку введённого значения?
Работаю с Oracle с помощью ADO в Delphi есть таблица STADIUMS (NAME,...

Доступ к данным через TDBGrid и TADODataSet
Добрый день! Я видел примеры, когда к данным в гриде обращаются так: ...

17
quwy
Native x86
3333 / 2180 / 649
Регистрация: 13.02.2013
Сообщений: 7,239
23.09.2014, 12:59 #2
Цитата Сообщение от Shakielpel Посмотреть сообщение
эти файлы не должны сохраняться на локальном жестком диске пользователя, как бы этого достичь?
TClientDataSet.LoadFromStream

Цитата Сообщение от Shakielpel Посмотреть сообщение
Как сделать так, чтобы скачивать могли лишь те кто получил на это разрешение, а не все подряд кто знает по какому адресу лежат эти файлы(защита фтп паролем не вариант, сегодня ему можно качать, а завтра уже нельзя. Но программа которая будет качать написана мной)
Защита FTP индивидуальными паролями для каждого пользователя.

Цитата Сообщение от Shakielpel Посмотреть сообщение
Опять же, если узнать пароль к фтп, то можно стырить все базы сторонней программой, что есть катастрофа.
От этого спасет только честная трехзвенка, т.е. вариант 2.

Цитата Сообщение от Shakielpel Посмотреть сообщение
при старте загружать сразу все таблицы?
Крайне плохое решение, чем оно будет отличаться от FTP?

Цитата Сообщение от Shakielpel Посмотреть сообщение
Количество баз MySQL на сервере очень ограничено
Оно ограничено только на дешевых shared-хостингах. В моем проекте каждый инстанс MySQL обслуживает до 3000 баз и ничего ему не делается от этого.

Цитата Сообщение от Shakielpel Посмотреть сообщение
Значит все наборы нужно хранить в одной базе, как бы это вообще организовать
Специально для нищебродских хостингов придуманы префиксы таблиц.

Цитата Сообщение от Shakielpel Посмотреть сообщение
Та же проблема с доступом - т.е. сначала клиент должен получить подтверждение, что имеет право получать эти данные, а уж потом получать их.
Это можно разрулить правами доступа на уровне MySQL, но трехзвенка тут была бы уместнее.

Цитата Сообщение от Shakielpel Посмотреть сообщение
Какие еще есть советы, идеи, предложения?
Создание промежуточного приложения, которое имеет неограниченный доступ к БД и реализует некий протокол, который уже проверяет уровни доступа каждого пользователя и выполняет его запросы на выдачу тех или иных данных. В этом случае можно реализовать гораздо более гибкую систему безопасности, чем на уровне прав MySQL (например, ограничить доступ не к таблице целиком, а к конкретным записям этой таблицы).
0
Shakielpel
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 244
23.09.2014, 13:30  [ТС] #3
От этого спасет только честная трехзвенка, т.е. вариант 2.
а можно поподробней что значит трехзвенка?

Создание промежуточного приложения, которое имеет неограниченный доступ к БД и реализует некий протокол, который уже проверяет уровни доступа каждого пользователя и выполняет его запросы на выдачу тех или иных данных. В этом случае можно реализовать гораздо более гибкую систему безопасности, чем на уровне прав MySQL (например, ограничить доступ не к таблице целиком, а к конкретным записям этой таблицы).
это вот это трехзвенка? но в чем собственно разница? клиент который и будет эту базу забирать себе пишу тоже я, что пользователю можно, а что нельзя можно узнать постучавшись в базу только. это доп. звено тоже будет стоять у пользователя на машине получается, и кул хацкеры могут поглядеть чего оно посылает на сервер и стырить оттуда все) те же проблемы что и в обращении от клиента к бд на прямую... не вижу преимуществ...

Я бы видел в этом смысл, если бы это среднее звено стояло на хосте, но как его туда положить я не знаю, разве что PHP скриптами если его там сделать, да их вызывать, а они будут решать что можно и что нельзя...но тут опять же ужасов куча, как через пхп базу то передавать...

Добавлено через 2 минуты
Цитата Сообщение от quwy Посмотреть сообщение
Специально для нищебродских хостингов придуманы префиксы таблиц.
а можно привести пример не нищебродского? т.е. 300 р. в месяц это еще нищебродский хостинг?) и 7 баз лимит. либо будет лимит по объему этих баз...

Добавлено через 3 минуты
Цитата Сообщение от quwy Посмотреть сообщение
Крайне плохое решение, чем оно будет отличаться от FTP?
на самом деле я уже пришел к выводу что именно так и делать, да собственно и сейчас так, вся база сразу загружается в память. 1) Обращаться к базе постоянно не вариант, это слишком медленно, т.е. данные по каждому объекту загружаются 1 раз при первом обращении. Если загружать данные по мере их надобности пообъектно, то в случае если базу обновят клиентским сессиям придет карачун, поэтому я решил, что лучше оставить как есть и грузить в начале всю базу.

Добавлено через 3 минуты
Цитата Сообщение от quwy Посмотреть сообщение
Крайне плохое решение, чем оно будет отличаться от FTP?

т.е. лучше не париться и фтп?, а то уже выяснилось что удаленно подключиться к MySQL это та еще песня )
0
quwy
Native x86
3333 / 2180 / 649
Регистрация: 13.02.2013
Сообщений: 7,239
23.09.2014, 14:12 #4
Цитата Сообщение от Shakielpel Посмотреть сообщение
это вот это трехзвенка?
Да.

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

Цитата Сообщение от Shakielpel Посмотреть сообщение
Я бы видел в этом смысл, если бы это среднее звено стояло на хосте
Что значит "на хосте"? Оно должно стоять на сервер, например том же, где и MySQL.

Цитата Сообщение от Shakielpel Посмотреть сообщение
а можно привести пример не нищебродского?
Шаред-хостинги все нищебродские по своей сути. Поэтому для проекта сложнее сайта-визитки, и уж тем более для распределенного приложения, только VPS, а еще лучше DS. Там администратор -- полный хозяин и никто никак не может ограничить такие вещи, как количество баз, все упирается только в свободное место на диске.

Цитата Сообщение от Shakielpel Посмотреть сообщение
я решил, что лучше оставить как есть и грузить в начале всю базу
Тогда слив базы -- исключительно вопрос желания того, кто будет с ней работать.

Цитата Сообщение от Shakielpel Посмотреть сообщение
выяснилось что удаленно подключиться к MySQL это та еще песня
А в чем проблема? Тот же TClientDataSet вместе с компонентами dbExpress умеет работать с MySQL совершенно прозрачно, точно так же, как и с локальным файлом.
0
Shakielpel
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 244
23.09.2014, 16:11  [ТС] #5
Что значит "на хосте"? Оно должно стоять на сервер, например том же, где и MySQL.
на хостине, ну то есть на сервере. я уже размышляю как это через запуск пхп скриптов делать. потому как как на хостинге в инете запустить свой екзешник я понятия не имею.

Добавлено через 2 минуты
Цитата Сообщение от quwy Посмотреть сообщение
Тогда слив базы -- исключительно вопрос желания того, кто будет с ней работать.
будет затруднительно выковырять ее из ОЗУ да еще и запущенного приложения, т.к сохранятся на диске она не будет. Не думаю что кто то станет заморачиваться настолько. В приложении клиента тупо нет функционала чтобы просмотреть ее содержимое. Такой функционал есть только в приложении создателя этой базы, а уж если он захочет ее слить куда то, то это его дело

Добавлено через 6 минут
Цитата Сообщение от quwy Посмотреть сообщение
А в чем проблема? Тот же TClientDataSet вместе с компонентами dbExpress умеет работать с MySQL совершенно прозрачно, точно так же, как и с локальным файлом.
во первых скорей всего чтобы подрубиться к MySQL нужно мутить SSH тунель, иначе доступа не дадут. через dbExpress нужно чтобы на сервере лежала актуальная dll или как то так, боюсь что это вообще не будет работать, что у них там лежит вообще хрен поймешь, мне ничего не видно ) так что остается только ZEOS. Но опять же я думаю лучше сделать через пхп скрипты.

Ну если это все принесет мне такой доход что будет оправдана аренда выделенного сервера, тогда можно и его снять...а пока пойдем по более простому пути )
0
quwy
Native x86
3333 / 2180 / 649
Регистрация: 13.02.2013
Сообщений: 7,239
23.09.2014, 16:12 #6
Цитата Сообщение от Shakielpel Посмотреть сообщение
будет затруднительно выковырять ее из ОЗУ да еще и запущенного приложения, т.к сохранятся на диске она не будет.
Вот этим инструментом я за 15 минут сделаю полный дамп таблицы TClientDataSet.

Цитата Сообщение от Shakielpel Посмотреть сообщение
я уже размышляю как это через запуск пхп скриптов делать
Это тоже трехзвенка. Не важно на чем написан сервер приложений, это может быть как экзешник, так и набор PHP-скриптов.

Цитата Сообщение от Shakielpel Посмотреть сообщение
потому как как на хостинге в инете запустить свой екзешник я понятия не имею.
На хостинге никак. Некоторые хостинги дают ssh, но и там exe запускать нечем, потому как Linux.
0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
23.09.2014, 16:16 #7
Цитата Сообщение от Shakielpel Посмотреть сообщение
как как на хостинге в инете запустить свой екзешник я понятия не имею
Арендуй VPS на базе Винды и запускай там все что твоей душе угодно.

Цитата Сообщение от Shakielpel Посмотреть сообщение
как это через запуск пхп скриптов делать
Нормально все равно не сделаешь - пых-скрипт априори не способен хранить сессионные данные клиента, ну разве что только через ж..у
0
Shakielpel
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 244
23.09.2014, 16:22  [ТС] #8
Цитата Сообщение от mss Посмотреть сообщение
Нормально все равно не сделаешь - пых-скрипт априори не способен хранить сессионные данные клиента, ну разве что только через ж..у
дык ему не надо хранить, он получает запрос из вне и ломится в базу, там в базе он сверяет запрос с данными базы и понимает нужно ли клиенту что то дать или послать его в сад. Ну и делает что понял )

Добавлено через 1 минуту
Цитата Сообщение от mss Посмотреть сообщение
Арендуй VPS на базе Винды и запускай там все что твоей душе угодно.

как я уже сказал, на данном этапе VPS это слишком дорого.
0
quwy
23.09.2014, 16:23
  #9

Не по теме:

Цитата Сообщение от mss Посмотреть сообщение
пых-скрипт априори не способен хранить сессионные данные клиента
Это почему?

0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
23.09.2014, 16:32 #10
Цитата Сообщение от Shakielpel Посмотреть сообщение
дык ему не надо хранить
дык назвать его после этого полноценным 2-м звеном язык не поворачивается)

Цитата Сообщение от Shakielpel Посмотреть сообщение
и ломится в базу
Если бы ломился)
Шевелится как беременный таракан)
А уж если хитрож..ый хостер страдает оверселлингом (а наверняка страдает), то дела могут обстоять еще хуже)

Добавлено через 2 минуты
Цитата Сообщение от quwy Посмотреть сообщение
Это почему?
А где он их будет хранить, в базе что ли ?
Это и называется через ж..у

Добавлено через 1 минуту
пых-то изначально и придуман был для нищебродов)
0
quwy
Native x86
3333 / 2180 / 649
Регистрация: 13.02.2013
Сообщений: 7,239
23.09.2014, 16:36 #11

Не по теме:

Цитата Сообщение от mss Посмотреть сообщение
А где он их будет хранить, в базе что ли ?
В сессионном хранилище web-сервера, чем бы оно не являлось. На хостинге все равно других вариантов нет.



Добавлено через 1 минуту

Не по теме:

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

0
mss
23.09.2014, 17:03
  #12

Не по теме:

Цитата Сообщение от quwy Посмотреть сообщение
В сессионном хранилище web-сервера, чем бы оно не являлось
1. Много там не нахранишь.
2. Надежность/безопасность - под большим сомнением

Цитата Сообщение от quwy Посмотреть сообщение
нужно рассматривать только доступные инструменты
Тогда с нищебродством придется смириться и готовиться к большому геморрою)

0
Shakielpel
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 244
23.09.2014, 22:41  [ТС] #13
ну вы прям воодушевили )

Добавлено через 4 часа 18 минут
Цитата Сообщение от mss Посмотреть сообщение
Если бы ломился)
Шевелится как беременный таракан)
А уж если хитрож..ый хостер страдает оверселлингом (а наверняка страдает), то дела могут обстоять еще хуже)
это медленней чем качнуть базу с фтп? и это...я что-то не представляю себе как через php вернуть целую базу...я вообще как бы php не знаю ) ну и может тогда и нет вовсе смысла базы в скуль засовывать, а через пхп выдавать ссылку по которой их можно скачать...может даже без фтп вовсе, ведь с сайтов же как то файлы скачиваются...

только вот тут бы не помешала вводная, т.к. в части пхп и хостингов я очень начинающий )
0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
23.09.2014, 22:54 #14
Цитата Сообщение от Shakielpel Посмотреть сообщение
это медленней чем качнуть базу с фтп?
Если база с гулькину пипку, то без разницы.
Но ради базы с гулькину пипку затея с удаленным ее хранением вообще сомнительна.

Цитата Сообщение от Shakielpel Посмотреть сообщение
я вообще как бы php не знаю
Хочешь геморрой - придется узнать)
Но это всяко лучше чем совсем ничего или идея с фтп и загрузкой/выгрузкой баз целиком
0
Shakielpel
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 244
23.09.2014, 22:59  [ТС] #15
Цитата Сообщение от mss Посмотреть сообщение
Если база с гулькину пипку, то без разницы.
Но ради базы с гулькину пипку затея с удаленным ее хранением вообще сомнительна.
удаленное хранение нужно для того, чтобы многие и многие пользователи имели доступ к этой инфе, а не из за того что она большая ) в целом я надеюсь, что 20 мб это уже пипец какая большая база будет считаться ) ведь в противном случае ее замучаешься скачивать, и это будет очень неудобно при каждом запуске программы столько ждать...второй смысл, не дать клиентам получить содержимое этой базы (ибо это равносильно будет тому, если бы я своей программы исходные коды кому то отдал бы)
0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
23.09.2014, 23:14 #16
Так и весь кайф-то ClientDatSet'а в том, что он умеет базу гонять не целиком тудым-судым, а только локально кэшированные изменения в контролируемом им наборе данных)

Добавлено через 2 минуты
Цитата Сообщение от Shakielpel Посмотреть сообщение
20 мб это уже пипец какая большая база будет считаться
Гонять туда-сюда через Интернет по каждому чиху даже десять килобайт - затея сомнительная при любом раскладе.
0
Shakielpel
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 244
23.09.2014, 23:37  [ТС] #17
Цитата Сообщение от mss Посмотреть сообщение
Гонять туда-сюда через Интернет по каждому чиху даже десять килобайт - затея сомнительная при любом раскладе.
где ж сомнительная, есть же, например, такие сервисы, которые предоставляют возможность играть в игры не устанавливая их к себе на комп, игры вполне себе сингл плеерные. Можно было бы поставить на комп и все, а так гоняется туда сюда все (ну конечно там смысл в том, что сервер выполняет основную работу, поэтому не совсем корректный пример, но там и также реализовано то, что ты платишь за возможность играть постоянно, а не единоразово) Поэтому если нужно извлечь из процесса выгоду материальную, то уже не сомнительная идея )

Добавлено через 3 минуты
Цитата Сообщение от mss Посмотреть сообщение
Так и весь кайф-то ClientDatSet'а в том, что он умеет базу гонять не целиком тудым-судым, а только локально кэшированные изменения в контролируемом им наборе данных)
у меня время выполнения команды посланной объекту (инфа о котором и хранится в базе) - 125 миллисекунд, и это еще мне кажется медленным. Если я буду каждый раз в инет лезть, за этой инфой, то страшно представить сколько будет это занимать по времени, поэтому не вижу другого варианта, как перед запуском скачать всю базу целиком....думаю буду ее конвертировать в объекты программы и выгружать базу из памяти сразу...вот так вот. При нормальном раскладе, программу запускают, она загружает данные и работает несколько часов автономно. Поэтому все же не на каждый чих )
0
mss
2631 / 2256 / 275
Регистрация: 24.12.2010
Сообщений: 13,725
24.09.2014, 00:00 #18
Цитата Сообщение от Shakielpel Посмотреть сообщение
есть же, например, такие сервисы, которые предоставляют возможность играть в игры не устанавливая их к себе на комп
Такого быть не может)
На клиентскую сторону распределенного приложения загружается как минимум тонкий клиент.

Цитата Сообщение от Shakielpel Посмотреть сообщение
Если я буду каждый раз в инет лезть, за этой инфой
Зачем всякий раз-то ? Только тогда когда в этом есть действительная необходимость - например, освежить весь НД или отдельные его записи, выгрузить кэшированные результаты создания/редактирования.удаления отдельных записей и т.п.

Добавлено через 10 минут
Цитата Сообщение от Shakielpel Посмотреть сообщение
скачать всю базу целиком....думаю буду ее конвертировать в объекты программы и выгружать сразу...вот так вот
Вот так вот примерно делали и делают, скажем, приложения на базе небезызвестной платформы 1С:Предприятие. И по сей день, когда 1С:Предприятие предлагает в т.ч. и трехзвенную распределенную архитектуру, продукт был и остается крайне неповоротливым монстром. В т.ч. и именно потому, что всякий раз при загрузке [тонко]клиентской части платформы и прикладной задачи под ее управлением происходит массированный обмен с БД (напрямую или при посредничестве 2-го звена) с построением огромной кучи кешированных объектов, львиная доля которых может вообще и не понадобиться на всем протяжении сеанса работы клиента.
0
24.09.2014, 00:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2014, 00:00
Привет! Вот еще темы с решениями:

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

Как лучше организовать хранение стандартных фраз у документов
Имеется некоторое количество документов. У каждого есть реквизит "Заключение"...

Как лучше организовать удаленный доступ
Есть такая задача. Есть сервер в центральном офисе, на нем 1С, mysql server....

Как организовать хранение ключей QSettings?
Всем привет! QSettings стал использоваться у меня во многих местах в программе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru