Ответы пользователя по тегу MySQL
  • Как организовать Doctrine One-To-One, Unidirectional with Join Table?

    @fattan Автор вопроса
    программист
    Сделал как советовал Myroslav Berlad в комментарии.
    Подробный результат:
    документы связал с промежуточной таблицей двусторонней связью 1 к 1
    Промежуточную таблицу (документ-статус) связал с таблицей статусов двусторонней связью 1 ко многим
    Схема БД та же, см. шапку.

    Создал 3 Entity.

    Для документов:
    спойлер
    <?php
    
    namespace Finance\ExpBundle\Entity;
    
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * Document
     *
     * @ORM\Table(name="exp_document", indexes={@ORM\Index(name="tasks_user_id_index", columns={"initiator_id"})})
     * @ORM\Entity(repositoryClass="Finance\ExpBundle\Repository\DocumentRepository")
     */
    class Document
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="initiator_id", type="integer", nullable=false)
         */
        private $initiatorId;
    
        /**
         * @var string
         *
         * @ORM\Column(name="name", type="string", length=255, nullable=false)
         */
        private $name;
    
        /**
         * @var \DateTime
         *
         * @ORM\Column(name="created_at", type="datetime", nullable=true)
         */
        private $createdAt;
    
        /**
         * @var \DateTime
         *
         * @ORM\Column(name="updated_at", type="datetime", nullable=true)
         */
        private $updatedAt;
    
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;
    
    
        /**
         * One Customer has One Cart.
         * @var DocStatus
         * @ORM\OneToOne(targetEntity="DocStatus", mappedBy="document")
         */
        private $docStatus;
    
    
        /**
         * @return DocStatus
         */
        public function getDocStatus()
        {
            return $this->docStatus;
        }
    
        /**
         * @return Status
         */
        public function getStatus()
        {
            return $this->getDocStatus()->getStatus();
        }
    
        /**
         * Set initiatorId
         *
         * @param integer $initiatorId
         *
         * @return Document
         */
        public function setInitiatorId($initiatorId)
        {
            $this->initiatorId = $initiatorId;
    
            return $this;
        }
    
        /**
         * Get initiatorId
         *
         * @return integer
         */
        public function getInitiatorId()
        {
            return $this->initiatorId;
        }
    
        /**
         * Set name
         *
         * @param string $name
         *
         * @return Document
         */
        public function setName($name)
        {
            $this->name = $name;
    
            return $this;
        }
    
        /**
         * Get name
         *
         * @return string
         */
        public function getName()
        {
            return $this->name;
        }
    
        /**
         * Set createdAt
         *
         * @param \DateTime $createdAt
         *
         * @return Document
         */
        public function setCreatedAt($createdAt)
        {
            $this->createdAt = $createdAt;
    
            return $this;
        }
    
        /**
         * Get createdAt
         *
         * @return \DateTime
         */
        public function getCreatedAt()
        {
            return $this->createdAt;
        }
    
        /**
         * Set updatedAt
         *
         * @param \DateTime $updatedAt
         *
         * @return Document
         */
        public function setUpdatedAt($updatedAt)
        {
            $this->updatedAt = $updatedAt;
    
            return $this;
        }
    
        /**
         * Get updatedAt
         *
         * @return \DateTime
         */
        public function getUpdatedAt()
        {
            return $this->updatedAt;
        }
    
        /**
         * Get id
         *
         * @return integer
         */
        public function getId()
        {
            return $this->id;
        }
    }



    Для промежуточной таблицы (документ-статус):
    Спойлер
    <?php
    
    namespace Finance\ExpBundle\Entity;
    
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * DocStatus
     *
     * @ORM\Table(name="exp_doc_status", indexes={@ORM\Index(name="id_doc", columns={"id_doc"}), @ORM\Index(name="id_status", columns={"id_status"})})
     * @ORM\Entity
     */
    class DocStatus
    {
        /**
         * @var \DateTime
         *
         * @ORM\Column(name="event_date", type="datetime", nullable=false)
         */
        private $eventDate = 'CURRENT_TIMESTAMP';
    
        /**
         * @var integer
         *
         * @ORM\Column(name="event_day", type="integer", nullable=false)
         */
        private $eventDay = '0';
    
        /**
         * @var integer
         *
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="NONE")
         */
        private $idDoc;
    
    
        /**
         * @ORM\OneToOne(targetEntity="Document", inversedBy="docStatus")
         * @ORM\JoinColumn(name="id_doc", referencedColumnName="id")
         */
        private $document;
    
    
        /**
         * @ORM\ManyToOne(targetEntity="Status", inversedBy="docStatus")
         * @ORM\JoinColumn(name="id_status", referencedColumnName="id")
         */
        private $status;
    
    
        public function getStatus()
        {
            return $this->status;
        }
    
        public function getDocument()
        {
            return $this->document;
        }
    
        /**
         * @var integer
         * @ORM\Id
         * @ORM\Column(name="id_status", type="integer", nullable=false)
         */
        private $idStatus;
    
        /**
         * Set eventDate
         *
         * @param \DateTime $eventDate
         *
         * @return DocStatus
         */
        public function setEventDate($eventDate)
        {
            $this->eventDate = $eventDate;
    
            return $this;
        }
    
        /**
         * Get eventDate
         *
         * @return \DateTime
         */
        public function getEventDate()
        {
            return $this->eventDate;
        }
    
        /**
         * Set eventDay
         *
         * @param integer $eventDay
         *
         * @return DocStatus
         */
        public function setEventDay($eventDay)
        {
            $this->eventDay = $eventDay;
    
            return $this;
        }
    
        /**
         * Get eventDay
         *
         * @return int
         */
        public function getEventDay()
        {
            return $this->eventDay;
        }
    
        /**
         * Get idDoc
         *
         * @return \Finance\ExpBundle\Entity\Document
         */
        public function getIdDoc()
        {
            return $this->idDoc;
        }
    
    }



    Для статусов:
    Спойлер
    <?php
    
    namespace Finance\ExpBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * Status
     *
     * @ORM\Table(name="exp_status")
     * @ORM\Entity
     */
    class Status
    {
        /**
         * @var string
         *
         * @ORM\Column(name="name", type="string", length=255, nullable=false)
         */
        private $name;
    
        /**
         * @var integer
         *
         * @ORM\Column(name="day_by_reglament", type="integer", nullable=false)
         */
        private $dayByReglament = '0';
    
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;
    
    
        /**
         * @ORM\OneToMany(targetEntity="DocStatus", mappedBy="status")
         */
        private $docStatus;
    
    
        public function getDocStatus()
        {
            return $this->docStatus;
        }
    
    
        /**
         * Set name
         *
         * @param string $name
         *
         * @return Status
         */
        public function setName($name)
        {
            $this->name = $name;
    
            return $this;
        }
    
        /**
         * Get name
         *
         * @return string
         */
        public function getName()
        {
            return $this->name;
        }
    
        /**
         * Set dayByReglament
         *
         * @param integer $dayByReglament
         *
         * @return Status
         */
        public function setDayByReglament($dayByReglament)
        {
            $this->dayByReglament = $dayByReglament;
    
            return $this;
        }
    
        /**
         * Get dayByReglament
         *
         * @return integer
         */
        public function getDayByReglament()
        {
            return $this->dayByReglament;
        }
    
        /**
         * Get id
         *
         * @return integer
         */
        public function getId()
        {
            return $this->id;
        }
    }



    В результате, получить информацию о статусе документа в Symfony3 можно таким образом:

    В action контроллера:

    $em = $this->getDoctrine();
    $repoDoc = $em->getRepository(Document::class);
    $doc = $repoDoc->find($id);
    
    dump($doc->getStatus()->getName());
    dump($doc->getStatus()->getDayByReglament());


    В шаблонизаторе twig:

    {{ dump(doc.status.name) }}
    {{ dump(doc.status.dayByReglament) }}
    Ответ написан
    Комментировать
  • Разумно ли использовать xampp в качестве боевого сервера?

    @fattan Автор вопроса
    программист
    И что такого там можно настроить, что существенно изменит работу xampp?
    Какого типа это будут настройки? Настройки по увеличению памяти отводимой серверам? (делаем такие для апача ThreadStack вроде называется). Настройки кеширования? Делаем такие для мускула. Для PHP разве что лимиты по работе с файлами и время выполнения скриптов и error_reporting. На этом наши настройки заканчиваются.
    Ответ написан
    Комментировать
  • Как объективно протестировать производительность node.js и PHP в запросах к mysql БД?

    @fattan Автор вопроса
    программист
    Итак. Спасибо за ответы. Я понял в чем дело. Т.к. программирую на node.js аж целых 2 недели, я неверно трактовал результаты. Изменил тест, и вышло вот что:

    var start = new Date();
    
    var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'root',
      password : '', 
      database : 'epr'
    });
    
    
    for (var i = 0; i < 1000; i++) {
    	connection.query(
    		'SELECT * FROM dreg_document', 
    		function(error, result, fields){
    			
    			var str = '';
    			
    			result.forEach(function(row){
    
    				str += ' ' + row.id + ' ';
    
    			});
    			console.log(str);
    		}
    	);
    }
    
    connection.end();
    
    var end = new Date();
    console.log('node.js %d мс', (end.getTime()-start.getTime()) / 1000);
    	
    client.send('qwerty');


    Если думать по php-шному, после отработки всех запросов, отправляется сообщение клиенту -
    client.send('qwerty');

    Но на деле, сообщение отправляется тогда когда node-server отправит к БД ВСЕ запросы. Затем (! не дожидаясь ответа от БД) сервак отправляет клиенту сообщение. Клиент (браузер) подсчитывает время (вышло, к примеру 2 секунды для 100 000 итераций). А в это время в ноду продолжают поступать ответы от БД. Эти ответы мы видим с помощью
    console.log(str);
    И тут уже получаются совсем другие результаты....

    Далее, изменяем скрипт следующим образом, чтобы подсчитать время выполнения от 1го до последнего асинхронного подключения к БД:
    // начало выполнения скрипта
    var start = new Date();
    // счетчик обращений к БД
    var ConnCountGlobal = 0;
    // Число обращений к БД
    var iLength         = 100;
    
    var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'root',
      password : '', 
      database : 'epr'
    });
    
    for (var i = 0; i < iLength; i++) {
    	connection.query(
    		'SELECT * FROM dreg_document', 
    		function(error, result, fields){
    			
    			// для последнего запроса вычисляем таймер
    			if (ConnCountGlobal == iLength-1){
    			
    				var dateObj   = new Date();
    				var currTime  = dateObj.getTime();
    			
    				console.log(' node.js - %d мс', (currTime-start.getTime()) / 1000);
    			}
    
    			ConnCountGlobal++;
    		}
    	);
    }
    
    connection.end();


    Результат
    Для 100 итераций 2.5 сек (что в 15 раз медленнее чем на PHP)

    Промежуточный ответ на топик:
    Node.js не быстрее PHP в 150 раз в вопросе доступа к БД.
    Напротив, Node.js в этом плане в 15 раз медленнее чем PHP.
    (это если брать оба сервера "из коробки", без улучшательств и настроек)

    Новый вопрос:
    Верен ли мой последний тест? Или я в нём тоже что-то не так сделал?
    Ответ написан
    9 комментариев
  • Как установить Maven зависимость mysql-connector-java?

    @fattan Автор вопроса
    программист
    Отлично! Данила помог.

    Всё заработало! Стоило написать в C:\apache-maven-3.3.1\conf\settings.xml

    <proxies>
         <proxy>
          <active>true</active>
          <protocol>http</protocol>
          <username>marchenko_am@domain.ru</username>
          <password>1</password>
          <host>192.168.0.31</host>
          <port>8080</port>
          <nonProxyHosts>local.net|domain.ru</nonProxyHosts>
        </proxy>
      </proxies>


    Замечу также что был еще один баг - в самой intellij idea. Она не хотела работать с 3м мавеном.
    помогает установка новой (14.1.1) версии
    https://youtrack.jetbrains.com/issue/IDEA-137783
    Ответ написан
    Комментировать