Ответы пользователя по тегу Базы данных
  • Tsrange вывод временных интервалов?

    Kwisatz
    @Kwisatz
    Больше web-приложений, хороших и разных
    Оно?
    with
      all_ranges as (
        SELECT tsrange(generate_series, 
                       generate_series + interval '30' minute, 
                       '()') as range 
        FROM generate_series(current_date::timestamp + interval '9' hour,
                             current_date::timestamp + interval '18' hour, 
                             '30 minutes'))      
    select rooms.id as room_id,
           concat(to_char(lower(ar.range), 'HH24:MI'), 
                  ' - ', 
                  to_char(upper(ar.range), 'HH24:MI')) as timerange
    from all_ranges as ar
    cross join rooms 
    where not exists (select 1 
                      from reservations as rt
                      where rooms.id=rt.room_id and 
                            ar.range && rt.occurrence)
    order by 1;

    SQL Fiddle
    Ответ написан
    3 комментария
  • Кто может подсказать по теоретическим вопросам по архитектуре таких сайтов, как соц.сети, сайты знакомств (интересует back-end: БД, картинкохранение)?

    Kwisatz
    @Kwisatz
    Больше web-приложений, хороших и разных
    На половину оптимизационных вопросов гуглите YAGNI.
    По бд возьмите PostgreSQL или Oracle. В обоих есть инструменты для решения всех ваших вопросов. Естественно оракловая база стоит немалых денег.
    На NoSQL вообще не смотрите. Единственный сценарий использования NoSQL это таблицы фактов (как например лента пользователя) когда сами данные важнее связей между различными сущностями.
    Ответ написан
  • База данных для хранения больших данных?

    Kwisatz
    @Kwisatz
    Больше web-приложений, хороших и разных
    Выше вам все верно расписали кроме одного. Нет вообще никаких причин использовать MySQL. Имхо берите PostgreSQL и наймите хорошего DBA
    Ответ написан
  • Какие технологии выбрать для создания базы данных?

    Kwisatz
    @Kwisatz
    Больше web-приложений, хороших и разных
    Я бы взял PostgreSQL как БД.
    Java/node.js/php на сервере
    Одностраничник на клиенте.

    Однако нужен человек с опытом проектирования хороших интерфейсов, ну и специалисты по выше перечисленным трем пунктам.

    Если вы очень начинающий разработчик то возможно стоит заказать проработку такого решения (а судя по выбору mssql бюджет таки есть). Возможно даже по модели saas. Если что пишите - побеседуем.
    Ответ написан
    Комментировать
  • Как работает функционал удаления сообщения в больших социальных сетях?

    Kwisatz
    @Kwisatz
    Больше web-приложений, хороших и разных
    Вариант 2 и тому две причины:
    - фрагментация есть зло
    - необратимых действий быть не должно в принципе

    Что касаемо сообщений в двух ящиках то примерно так (в ваших терминах):
    message_id, is_deleted, keeper_id, sender_id, receiver_id, message

    Индекс по message строить беcполезно если у вас MySQL, у это СУБД нет FTS. Тут вам поможет elasticsearch или sphinx. Если же вы юзаете PostgreSQL то гуглите FTS и вперед)

    Если сервис маленький то преждевременная оптимизация вам ни к чему. Однако помните что при создании внешних ключей должны быть индексы по полям на которые ссылаетесь и с которых ссылаетесь.
    Я в таблице личных сообщений на достаточно крупном сервисе (более 500 млн сообщений) внешние ключи не ставил в принципе: сохранение консистентности данных не так важно. Если пользователей очень много можно пойти в сторону денормализации: отказаться от join и хранить имя отправителя/получателя в таблице сообщений.
    На определенном этапе так же возникнет вопрос кластеризации и шардинга таблицы, но это уже при количестве записей ближе к 1 млрд

    Если у вас будут объемы >1 млрд сообщений то я думаю тут уже будет разумен найм DBA, а пока YAGNI
    Ответ написан
  • Как лучше реализовать механизм "веса" значений в таблице БД?

    Kwisatz
    @Kwisatz
    Больше web-приложений, хороших и разных
    Напишите реальный пример где и зачем вам это нужно, без допустим.
    Ответ написан
    Комментировать
  • На что нужно обратить внимание при миграции с MySQL на PosgreSQL?

    Kwisatz
    @Kwisatz Автор вопроса
    Больше web-приложений, хороших и разных
    эээх, сам спросил сам ответил)

    Итак, на что собственно нужно обратить внимание:
    MySQL
    - поменять date_format(now() '%d.%m.%Y'); to_char( now(), 'DD.MM.YYYY' );
    - если нужно использовать unix_timestamp() (я ее использую для передаче dateDiff функции в PHP), то пишем:
    CREATE OR REPLACE FUNCTION unix_timestamp(timestamp without time zone)
      RETURNS integer AS
    $BODY$
    SELECT date_part('epoch', $1::timestamp)::INTEGER AS RESULT
    $BODY$
      LANGUAGE sql VOLATILE
      COST 100;

    - убрать все хаки производительности в запросах. Без глубочайшего знания PosgreSQL это все бесполезно. Сколько я ни экспериментировал, оптимизатор postgre оказывался умнее, хотя с MySQl у меня таких проблем нет.
    - убрать всевозможные указания на использования индексов итд
    - изучить типы данных postgre, ибо таблицы все придется переносить очень внимательно. Тот же some_id int(10) unsigned not null auto_increment превращается в some_id serial
    - ну и листать на досуге документацию, ибо MySQL по сравнению с Posgre есть жуть недоразвитая.

    PHP
    - тут надо бы написать свою обертку вокруг pg_prepare и прочих функций, я себе сделал наподобие той, что у меня была для MySQL, но пока еще не все нюансы вылизал.
    - Учесть, что prepared запросы postgre хранит на соединение, это нужно учитывать, иначе pg_prepare кидает ошибку. Я себе сваял нечто, вроде:
    private static function getPrepared()
        {
        $result=pg_query(self::$pgConn, 'SELECT name FROM pg_prepared_statements');
        while ($data=pg_fetch_object($result))
          {
          self::$prepareds[(string)$data->name]=1;
          }
        }


    PostgreSQL
    - сразу как только загрузите бд 1с, лучше выполнить analyze по всем таблицам
    - затюнить бд, методом правки конфига
    - Если будете использовать View на таблицы 1с (я их создаю пачками, ибо работать с document132._field1439_rref Нет никакого желания), то создавайте их в отдельной схеме и дропайте ее перед внесением серьезных изменений в конфигурацию (и не забываем про бекапы). При внесении серьезных изменений, скажем добавление реквизита, 1с попытается дропнуть таблицу (да-да, они не знают что такое alter), но при наличии на этой таблице зависимостей, выдаст критическую ошибку. При такой ошибке ни в коем случае нельзя закрывать конфигуратор, можно просто убрать зависимости и нажать обновить еще разок. Если закрыли конфигуратор то вам предстоит весьма увлекательный квест (хотя вариантов решения проблемы есть 2.5).
    - Аналогично нужно помнить о триггерах и собственных индексах на таблицах, они не помешают 1с дропнуть таблицу, но сами естественно умрут вместе с ней.


    У 1с начиная с версии 8.2.какойтотам есть механизм подключения к внешним источникам данных. В 8.3 с ними даже можно работать на запись и модификацию довольно нативно, а так же использовать функции. Огромный плюс в том, что подцепив таблицу с нужным перечнем полей, можно использовать все это дело как реквизит во всех элементах конфигурации, а так же использовать в запросах. Единственный баг, который я наблюдаю и у 8.2 и у 8.3: соединение с бд то есть постоянное, то выдает окно подключения, то подвисает на нем. Решение:
    //mydb - имя источника данных заданное в 1с
    Параметры = ВнешниеИсточникиДанных.mydb.ПолучитьОбщиеПараметрыСоединения();
    Параметры.АутентификацияСтандартная = Истина;
    Параметры.ИмяПользователя = "user";
    Параметры.Пароль = "password";
    Параметры.СтрокаСоединения = "DRIVER={PostgreSQL Unicode(x64)};SERVER=127.0.0.1;port=5432;UID=user;PWD=password;DATABASE=somedb";
    Параметры.СУБД = "PostgreSQL";
    
    ВнешниеИсточникиДанных.mydb.УстановитьОбщиеПараметрыСоединения(Параметры);
    ВнешниеИсточникиДанных.mydb.УстановитьПараметрыСоединенияПользователя(ИмяПользователя(), Параметры);
    ВнешниеИсточникиДанных.mydb.УстановитьПараметрыСоединенияСеанса(Параметры);
    
    ВнешниеИсточникиДанных.mydb.УстановитьСоединение();


    Ну вот вроде все, что пока вспомнил 8)
    Ответ написан
    Комментировать