• JOIN всегда делает декартово произведение?

    @Akela_wolf
    Extreme Programmer
    Если вас интересует это в плане получаемого результата - то да, можно рассматривать это так: декартово произведение + фильтр строк по условию (и добавление NULL-ов в случае LEFT JOIN).

    Если интересует как это устроено внутри СУБД - то там далеко не всегда будет декартово произведение, потому что это довольно затратная операция. Какие конкретно операции будет выполнять СУБД можно увидеть по EXPLAIN-у - это называется план запроса. Там может быть и NESTED LOOP (вложенный цикл) и MERGE JOIN и другие операции, которые планировщик запроса сочтет подходящими для данного конкретного сочетания таблиц в данном конкретном запросе (на это влияет структура запроса, наличие индексов, собранная по таблицам статистика и пр. факторы, углубляться в которые я сейчас не буду).
    Ответ написан
    Комментировать
  • RESTRICT и NO ACTION где увидеть разницу?

    @galaxy
    Ну вот вам такой пример

    create table p (id serial primary key, val text);
    
    create table c (id serial primary key, p_id int not null references p(id) on delete no action deferrable, val text);
    
    insert into p (val) values ('a'), ('b');
    
    insert into c (p_id, val) values (1, 'a1'), (1, 'a2'), (1, 'a3'), (2, 'b1');
    
    begin;
    set constraints all deferred;
    delete from p where id = 2;
    delete from c where p_id = 2;
    commit;


    Почитайте также про отложенные ограничения
    Ответ написан
    Комментировать
  • Что значит точность не меньше 6 цифр у real?

    @galaxy
    А что, по-вашему, это может значить?
    6 значащих цифр гарантируется, т.е. 123456 можно хранить, а 123456789 - можно, но с потерей точности:
    postgres=# select 123456789::real;
        float4
    ---------------
     1.2345679e+08


    Это на самом деле обычные ограничения 4-х байтового float, с некоторым запасом.
    Ответ написан
    4 комментария
  • Что наследуется в ООП? Как работает наследование?

    @402d
    начинал с бейсика на УКНЦ в 1988
    п.3 var_dump() подойдет ?
    п.1 Да. Но ты не можешь к ним обратиться напрямую. Обычно они в родительском классе инициализируются через конструктор. Так что в наследнике вызываешь сперва конструктор родителя . А потом присваиваеш свои дополнительные поля.

    п.2) Публик - протектед высасан из пальца.

    https://www.php.net/manual/ru/language.oop5.interf...

    Понятие интерфейса более удобно когда объект должен уметь что-то делать, чем протягивать наследование от общего предка.
    Ответ написан
    Комментировать
  • Что наследуется в ООП? Как работает наследование?

    Adamos
    @Adamos
    Publlic / protected / private - это архитектура. Компьютеру они на хрен не нужны, они ограничивают программиста.
    И уж если программист считает, что метод должен быть публичным - значит, любой наследник должен его реализовывать. Если приватным - значит, нечего в него лезть наследникам. Если защищенный - значит, только этот класс и его наследники о том, что он существует, и должны знать.

    А если у вас сын утки плавает, как утка, но молчит, как рыба - это не он урод, а вы с планированием классов обосрались. Нет, не тот парень, от чьих классов вы наследуетесь, а именно вы. И те парни, которым надо будет поддерживать ваш код (если они знают не только о принципе Лисков, но и где вы живете) смогут очень доходчиво вам это объяснить.
    Ответ написан
    5 комментариев
  • Что наследуется в ООП? Как работает наследование?

    @alexanderzanin
    1. Все верно, все наследуется.
    2. Тут нужно понимать, для чего существуют public, protected, private. Public используется для использования функционала класса в других частях программы. Если у класса один метод public и условно 10 private методов, то в приватных методах скрыта реализация функционала, а public уже отдает или получает, или то и другое. Классу, который использует public метод другого класса не важно, как работает все внутри приватных методов. Поэтому и смысла нет в изменении public на protected или private. Иначе ваш класс становиться замкнутым и бесполезным.
    3. тут можно почитать про reflection
    Ответ написан
    8 комментариев
  • Обязательно ли при постоении REST API использовать что-то кроме GET,POST?

    @nofail
    Методы HTTP используются потому что хорошо подходят для взаимодействия с ресурсами и документированы. Вам не нужно догадываться что делает GET, это в rfc описано. То есть не возникают ситуации "Так... мне нужно получить ресурс с таким-то id, что мне делать - послать GET? POST? DELETE?"
    Если ваше приложение соответствует требованиям Филдинга
    1. Клиент-Сервер
    2. Сервер не должен хранить состояние клиента
    3. Кэширование
    4. Единый интерфейс между компонентами
    5. Идентификация ресурса
    6. Манипуляции над ресурсами через представления
    7. Само-описывающие сообщения
    8. HATEOAS (hypermedia as the engine of application state)
    9. Многослойная архитектура
    10. Код по запросу (Опционально)

    то это будет REST, даже если вообще не используется HTTP, а вместо этого вы обмениваетесь записками через дупла.
    Ответ написан
    1 комментарий
  • Права в Linux на директории важнее прав вложенных файлов и папок?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Права на каталог дают вам возможность работать со списком файлов этого каталога. Вы можете прочитать этот список (r), создавать, переименовывать и удалять файлы и менять права на каталог (w), получать доступ к файлам и подкаталогам (x).
    Права на файлы и подкаталоги не мешают их удалить, если у вас есть право записи (w) на основной каталог.
    Ответ написан
    2 комментария
  • Если удалить образ, который используется в контейнере, то почему контейнер не падает?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Образ - это не какой-то набор файлов. Это по сути список слоёв (fslayer), которые могут быть общими у разных образов. Имя образа (с тэгом) - это ссылка на id образа. У образа может быть несколько имён (например, foobar:1.2.3 и foobar:latest). Удаление образа по имени имени не удаляет образ, оно удаляет лишь имя, затем если у id образа больше нет других имён и образ не используется больше никем удаляет те fslayer образа, которые заведомо не нужны другим образам и контейнерам. Поэтому иногда docker rmi говорит всего лишь "untagged имя_образа", а иногда реально удаляет какие-то слои.

    $ docker pull alpine
    Using default tag: latest
    latest: Pulling from library/alpine
    540db60ca938: Pull complete 
    Digest: sha256:69e70a79f2d41ab5d637de98c1e0b055206ba40a8145e7bddb55ccc04e13cf8f
    Status: Downloaded newer image for alpine:latest
    docker.io/library/alpine:latest
    $ docker tag alpine foo/bar/lorem/ipsum:some.tag
    $ docker rmi alpine
    Untagged: alpine:latest
    Untagged: alpine@sha256:69e70a79f2d41ab5d637de98c1e0b055206ba40a8145e7bddb55ccc04e13cf8f
    $ docker rmi foo/bar/lorem/ipsum:some.tag
    Untagged: foo/bar/lorem/ipsum:some.tag
    Deleted: sha256:6dbb9cc54074106d46d4ccb330f2a40a682d49dda5f4844962b7dce9fe44aaec
    Deleted: sha256:b2d5eeeaba3a22b9b8aa97261957974a6bd65274ebd43e1d81d0a7b8b752b116


    При создании контейнера поверх слоённой файловой системы образа создаётся новый слой для собственных файлов контейнера. Поэтому физически образ нельзя до конца удалить, пока есть хоть один контейнер на его базе.
    Ответ написан
    2 комментария
  • Можно ли через foreach перебирать объект класса?

    Nordic_Alf
    @Nordic_Alf
    PHP Developer
    Да. Переберёт все публичные свойства.
    А если надо ещё и протектед/приватные, то просто создай внутри класса метод с перебором всех свойств:

    <?php
    class MyClass
    {
        public $public = 'значение 1';
        protected $protected = 'защищённая переменная';
        private $private   = 'закрытая переменная';
    
        public function iterateAll() {
           foreach ($this as $key => $value) {
               print "$key => $value\n";
           }
        }
    }
    
    $class = new MyClass();
    $class->iterateAll();
    Ответ написан
    Комментировать
  • Для каких целей Golang лучше?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Микросервис в двух словах - это самостоятельная сетевая единица со своим потоком исполнения, своим URI и своим маленьким (как правило REST) API для которой поднимать nginx setup избыточно.
    Ответ написан
    5 комментариев
  • Для каких целей Golang лучше?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Go создавался для простой разработки асинхронных сетевых серверов и в этом блещет. Например написать на нём что-нибудь вроде Nginx сильно проще, чем на C.
    Ответ написан
    1 комментарий
  • А как на серверах функция mail отправляет почту?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Использует sendmail
    echo ini_get('sendmail_path');
    sendmail_path	
    /usr/sbin/sendmail -t -i
    Ответ написан
    9 комментариев
  • Метод boot в Service Provider когда срабатывает?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    Да.
    Ответ написан
    Комментировать
  • Переменная в цикле удаляется сборщиком мусора после итерации?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Ничего подобного!
    Переменная создается при первом вызове и сохраняется до конца выполнения скрипта.
    Значениые переменной изменяется при каждой итерации и сохраняется при завершении цикла!

    Share PHP code
    Ответ написан
    Комментировать
  • Несколько вопросов про NULL?

    @galaxy
    1) При использовании операторов =, <, >, <> - да
    2) Нет. Но при этом он не является true, т.е. при использовании в WHERE или JOIN условие с ним сработает как ложное. Ну и вне БД, например, в PHP и других слабо типизированных языках он легко превращается в false
    3) Странный вопрос какой-то, перевернутый. Операторы IS NULL/IS NOT NULL придумали потому, что сравнение с NULL обычными операторами работает не так, как все привыкли. Вообще, в SQL троичная логика (на примере =):
    =     | TRUE    FALSE   NULL
    ________________________________
    TRUE  | TRUE    FALSE   NULL
    FALSE | FALSE   TRUE    NULL
    NULL  | NULL    NULL    NULL
    Ответ написан
    Комментировать
  • Несколько вопросов про NULL?

    BorLaze
    @BorLaze
    Java developer
    Достаточно держать в памяти, что есть три варианта ответа - да/нет/что угодно (true/false/null), и тут же все станет понятно:

    1) Да. "что угодно" = "что-то конкретное" дает "что угодно, потому-то слева может быть и правое значение, и любое другое.
    2) Нет. См. п.1.
    3) Нельзя, потому что п.1.

    То есть, можно представить себе, что в null может быть любое значение - как равное конкретному, с которым мы сравниваем, так и не равное. Поэтому результат тоже может быть любым.

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

    UPD: или же можно трактовать null как функцию random() - так еще понятней.
    1) 1 = random()? А кто его знает - может, равно, а может, и нет... то есть ответ рандомный.
    2) random() это false? Может, да, а может, и нет... в общем, все тот же рандом.
    3) Из вышеизложенного вытекает, что любое сравнение какого-то конкретного значения с рандомным дает рандомный результат. А операторы IS NULL/IS NOT NULL как раз работают как "это рандом?" и "это не рандом?" - поэтому для работы с null надо использовать именно их.
    Ответ написан
    Комментировать
  • Что происходит при создании объекта класса(при наследовании) в PHP?

    @rPman
    Боюсь у вас все как то переусложнено.

    Классы в php это набор функций и переменных, при наследовании создается копия класса, в котором заменяются методы из потомка в наследнике, это касается так же методы конструктор и деструктор. Т.е. автоматически будет вызван только последний одноименный метод в цепочке наследования.

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

    И да, все что касается методов и их наследования скорее всего сделано однократно, в момент компиляции, а в момент создания экземпляра объекта в него копируются методы и переменные из этого сохраненного.

    Деструктор будет вызван если закончится работа приложения, закончатся ссылки (это кстати не факт, висячие могут жить до конца приложения, и даже unset не вызовет деструктор если есть ссылки на объект) и закончится область видимости переменной в которую поместили объект.
    пример:
    class A
    {
    	public $a;
    	function __construct(){echo '{C}';}
    	function __destruct(){echo '[';unset($this->a);echo 'D]';}
    }
    
    echo 1;
    $a=new A();$b=new A();
    $b->a=$a;$a->a=$b; // закоментируй, тогда деструктор будет вызван до вывода 2 иначе после
    unset($a);unset($b);
    echo 2;

    если есть ссылки:1{C}{C}2[[D]D]
    если ссылок нет: 1{C}{C}[D][D]2
    Ответ написан
    Комментировать
  • Как работает отправка заголовков в PHP?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Потому что протокол HTTP имеет вполне определенный формат

    Сначала заголовки, потом два перевода строки, далее содержимое.
    Понятно, что содержимое и заголовки нельзя перемешивать.

    https://developer.mozilla.org/ru/docs/Web/HTTP/Ove...
    https://habr.com/ru/post/215117/
    Ответ написан
    Комментировать