Skip to content

Instantly share code, notes, and snippets.

@BrightMilk
Last active July 25, 2022 06:56
Show Gist options
  • Select an option

  • Save BrightMilk/9801085164ba5535d5f9e61dadb5ef0e to your computer and use it in GitHub Desktop.

Select an option

Save BrightMilk/9801085164ba5535d5f9e61dadb5ef0e to your computer and use it in GitHub Desktop.

Revisions

  1. BrightMilk revised this gist Jul 24, 2022. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion B2BC_Task_1.md
    Original file line number Diff line number Diff line change
    @@ -5,7 +5,7 @@
    ### Хранение информации о поле

    Лучший способ для хранения информации о поле - использовать справочную таблицу возможных значений. Можно расширять таблицу по мере необходимости в новых значениях пола.
    Таким образом, в будущем получится избежать возможных проблем с определением гендерной принадлежности и, например, процессом смене пола.
    Таким образом, в будущем получится избежать возможных проблем с определением гендерной принадлежности и, например, с процессом по смене пола.
    Также все-таки лучше не использовать *null*-значения для пола - можно указать в качестве дефолтного значение не определенного пола из справочника.

    ### Хранение даты рождения
  2. BrightMilk revised this gist Jul 24, 2022. 1 changed file with 10 additions and 10 deletions.
    20 changes: 10 additions & 10 deletions B2BC_Task_1.md
    Original file line number Diff line number Diff line change
    @@ -74,16 +74,16 @@ INSERT INTO db.gender (name,description)
    VALUES ('female','Женщина');
    INSERT INTO db.`user` (name,gender_id,birthdate)
    VALUES ('Yvonne Mcdowell',2,'1979-10-09'),
    VALUES ('Lareina Harrington',2,'2001-03-22'),
    VALUES ('Carl Espinoza',1,'1999-01-01'),
    VALUES ('Mallory Buck',2,'2002-12-02'),
    VALUES ('Althea Morton',2,'2001-09-17'),
    VALUES ('Shannon Fry',2,'1992-07-12'),
    VALUES ('Chaim Rogers',1,'2002-11-11'),
    VALUES ('Rachel Payne',2,'2001-08-13'),
    VALUES ('Matthew Casey',1,'2000-10-25'),
    VALUES ('Baxter Thornton',1,'1998-06-09');
    VALUES ('Yvonne Mcdowell',3,'1979-10-09'),
    VALUES ('Lareina Harrington',3,'2001-03-22'),
    VALUES ('Carl Espinoza',2,'1999-01-01'),
    VALUES ('Mallory Buck',3,'2002-12-02'),
    VALUES ('Althea Morton',3,'2001-09-17'),
    VALUES ('Shannon Fry',3,'1992-07-12'),
    VALUES ('Chaim Rogers',2,'2002-11-11'),
    VALUES ('Rachel Payne',3,'2001-08-13'),
    VALUES ('Matthew Casey',2,'2000-10-25'),
    VALUES ('Baxter Thornton',2,'1998-06-09');
    INSERT INTO db.phone_number (`number`,user_id)
    VALUES ('(667) 281-8687',1),
  3. BrightMilk revised this gist Jul 24, 2022. 1 changed file with 29 additions and 2 deletions.
    31 changes: 29 additions & 2 deletions B2BC_Task_1.md
    Original file line number Diff line number Diff line change
    @@ -1,12 +1,38 @@
    # Решение [задания 1](https://gist.github.com/BrightMilk/057fcaafcdff913ed13c821f29d8fada)

    ## Оптимизация хранения данных

    ### Хранение информации о поле

    Лучший способ для хранения информации о поле - использовать справочную таблицу возможных значений. Можно расширять таблицу по мере необходимости в новых значениях пола.
    Таким образом, в будущем получится избежать возможных проблем с определением гендерной принадлежности и, например, процессом смене пола.
    Также все-таки лучше не использовать *null*-значения для пола - можно указать в качестве дефолтного значение не определенного пола из справочника.

    ### Хранение даты рождения

    Дату рождения лучше хранить в формате *DATE*, например, *1970-01-01*.

    Если хранить дату рождения в формате *TIMESTAMP (unixtime)*, то стоит учитывать, что *TIMESTAMP* имеет диапазон от *«1970-01-01 00:00:01»* до *«2038-01-19 03:14:07» (UTC)*, поэтому в большинстве случаев он не подходит для даты рождения.

    Можно использовать *DATETIME*, но тогда появляется необходимость со стороны пользователя заполнять также время рождения (что, как мне кажется, избыточно). Если такой необходимости нет - нужно использовать *DATE*.

    Также вышеперечисленные типы данных используют различное количество памяти для хранения значений:

    ```
    +------------+----------+
    | DATE: | 3 bytes |
    | TIMESTAMP: | 4 bytes |
    | DATETIME: | 8 bytes |
    +------------+----------+
    ```

    ## Схема БД

    ```
    CREATE TABLE db.`user` (
    id INT auto_increment NOT NULL,
    name varchar(100) NOT NULL,
    gender_id INT NOT NULL,
    gender_id INT DEFAULT 0 NOT NULL,
    birthdate DATE NOT NULL,
    CONSTRAINT user_PK PRIMARY KEY (id)
    )
    @@ -43,6 +69,7 @@ ALTER TABLE db.`phone_number` ADD CONSTRAINT phone_number_FK FOREIGN KEY (user_i

    ```
    INSERT INTO db.gender (name,description)
    VALUES ('unknown','Не определено'),
    VALUES ('male','Мужчина'),
    VALUES ('female','Женщина');
    @@ -84,7 +111,7 @@ INSERT INTO db.phone_number (`number`,user_id)
    ```
    SELECT u.`name`, count(pn.`id`) AS `amount of phone numbers` FROM testovoe.`user` u
    JOIN testovoe.`phone_number` pn ON pn.`user_id` = u.`id`
    WHERE u.`gender_id` = 2 AND TIMESTAMPDIFF(YEAR, u.`birthdate`, CURDATE()) BETWEEN 18 AND 22
    WHERE u.`gender_id` = 3 AND TIMESTAMPDIFF(YEAR, u.`birthdate`, CURDATE()) BETWEEN 18 AND 22
    GROUP BY pn.`user_id`;
    ```
    Результат:
  4. BrightMilk revised this gist Jul 24, 2022. 1 changed file with 4 additions and 1 deletion.
    5 changes: 4 additions & 1 deletion B2BC_Task_1.md
    Original file line number Diff line number Diff line change
    @@ -37,7 +37,11 @@ COLLATE=utf8mb4_general_ci;
    ALTER TABLE db.`user` ADD CONSTRAINT user_FK FOREIGN KEY (gender_id) REFERENCES db.gender(id);
    ALTER TABLE db.`phone_number` ADD CONSTRAINT phone_number_FK FOREIGN KEY (user_id) REFERENCES db.`user`(id);
    ```

    ## Тестовые данные

    ```
    INSERT INTO db.gender (name,description)
    VALUES ('male','Мужчина'),
    VALUES ('female','Женщина');
    @@ -72,7 +76,6 @@ INSERT INTO db.phone_number (`number`,user_id)
    VALUES ('(451) 437-3685',5),
    VALUES ('1-222-623-1235',2),
    VALUES ('1-713-424-7400',3);
    ```

    ## Выполнение запроса
  5. BrightMilk revised this gist Jul 24, 2022. 1 changed file with 5 additions and 2 deletions.
    7 changes: 5 additions & 2 deletions B2BC_Task_1.md
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,7 @@
    Решение [задания 1](https://gist.github.com/BrightMilk/057fcaafcdff913ed13c821f29d8fada).
    # Решение [задания 1](https://gist.github.com/BrightMilk/057fcaafcdff913ed13c821f29d8fada)

    ## Схема БД

    *SQL*-запрос выглядит следующим образом:
    ```
    CREATE TABLE db.`user` (
    id INT auto_increment NOT NULL,
    @@ -74,6 +75,8 @@ INSERT INTO db.phone_number (`number`,user_id)
    ```

    ## Выполнение запроса

    Запрос, возвращающий имя и число указанных телефонных номеров девушек в возрасте от 18 до 22 лет, выглядит следующим образом:
    ```
    SELECT u.`name`, count(pn.`id`) AS `amount of phone numbers` FROM testovoe.`user` u
  6. BrightMilk revised this gist Jul 24, 2022. 1 changed file with 13 additions and 1 deletion.
    14 changes: 13 additions & 1 deletion B2BC_Task_1.md
    Original file line number Diff line number Diff line change
    @@ -76,8 +76,20 @@ INSERT INTO db.phone_number (`number`,user_id)

    Запрос, возвращающий имя и число указанных телефонных номеров девушек в возрасте от 18 до 22 лет, выглядит следующим образом:
    ```
    SELECT u.`name`, count(pn.`id`) AS `amount of numbers` FROM testovoe.`user` u
    SELECT u.`name`, count(pn.`id`) AS `amount of phone numbers` FROM testovoe.`user` u
    JOIN testovoe.`phone_number` pn ON pn.`user_id` = u.`id`
    WHERE u.`gender_id` = 2 AND TIMESTAMPDIFF(YEAR, u.`birthdate`, CURDATE()) BETWEEN 18 AND 22
    GROUP BY pn.`user_id`;
    ```
    Результат:
    ```
    +--------------------+-------------------------+
    | name | amount of phone numbers |
    +--------------------+-------------------------+
    | Lareina Harrington | 3 |
    | Mallory Buck | 3 |
    | Althea Morton | 2 |
    | Rachel Payne | 2 |
    +--------------------+-------------------------+
    4 rows in set (0.001 sec)
    ```
  7. BrightMilk revised this gist Jul 24, 2022. 1 changed file with 8 additions and 1 deletion.
    9 changes: 8 additions & 1 deletion B2BC_Task_1.md
    Original file line number Diff line number Diff line change
    @@ -1,7 +1,6 @@
    Решение [задания 1](https://gist.github.com/BrightMilk/057fcaafcdff913ed13c821f29d8fada).

    *SQL*-запрос выглядит следующим образом:

    ```
    CREATE TABLE db.`user` (
    id INT auto_increment NOT NULL,
    @@ -73,4 +72,12 @@ INSERT INTO db.phone_number (`number`,user_id)
    VALUES ('1-222-623-1235',2),
    VALUES ('1-713-424-7400',3);
    ```

    Запрос, возвращающий имя и число указанных телефонных номеров девушек в возрасте от 18 до 22 лет, выглядит следующим образом:
    ```
    SELECT u.`name`, count(pn.`id`) AS `amount of numbers` FROM testovoe.`user` u
    JOIN testovoe.`phone_number` pn ON pn.`user_id` = u.`id`
    WHERE u.`gender_id` = 2 AND TIMESTAMPDIFF(YEAR, u.`birthdate`, CURDATE()) BETWEEN 18 AND 22
    GROUP BY pn.`user_id`;
    ```
  8. BrightMilk revised this gist Jul 24, 2022. 1 changed file with 8 additions and 8 deletions.
    16 changes: 8 additions & 8 deletions B2BC_Task_1.md
    Original file line number Diff line number Diff line change
    @@ -3,7 +3,7 @@
    *SQL*-запрос выглядит следующим образом:

    ```
    CREATE TABLE testovoe.`user` (
    CREATE TABLE db.`user` (
    id INT auto_increment NOT NULL,
    name varchar(100) NOT NULL,
    gender_id INT NOT NULL,
    @@ -14,7 +14,7 @@ ENGINE=InnoDB
    DEFAULT CHARSET=utf8mb4
    COLLATE=utf8mb4_general_ci;
    CREATE TABLE testovoe.gender (
    CREATE TABLE db.gender (
    id INT auto_increment NOT NULL,
    name varchar(100) NOT NULL,
    description varchar(100) NULL,
    @@ -24,7 +24,7 @@ ENGINE=InnoDB
    DEFAULT CHARSET=utf8mb4
    COLLATE=utf8mb4_general_ci;
    CREATE TABLE testovoe.phone_number (
    CREATE TABLE db.phone_number (
    id INT auto_increment NOT NULL,
    `number` varchar(255) NOT NULL,
    user_id INT NOT NULL,
    @@ -35,14 +35,14 @@ ENGINE=InnoDB
    DEFAULT CHARSET=utf8mb4
    COLLATE=utf8mb4_general_ci;
    ALTER TABLE testovoe.`user` ADD CONSTRAINT user_FK FOREIGN KEY (gender_id) REFERENCES testovoe.gender(id);
    ALTER TABLE testovoe.`phone_number` ADD CONSTRAINT phone_number_FK FOREIGN KEY (user_id) REFERENCES testovoe.`user`(id);
    ALTER TABLE db.`user` ADD CONSTRAINT user_FK FOREIGN KEY (gender_id) REFERENCES db.gender(id);
    ALTER TABLE db.`phone_number` ADD CONSTRAINT phone_number_FK FOREIGN KEY (user_id) REFERENCES db.`user`(id);
    INSERT INTO testovoe.gender (name,description)
    INSERT INTO db.gender (name,description)
    VALUES ('male','Мужчина'),
    VALUES ('female','Женщина');
    INSERT INTO testovoe.`user` (name,gender_id,birthdate)
    INSERT INTO db.`user` (name,gender_id,birthdate)
    VALUES ('Yvonne Mcdowell',2,'1979-10-09'),
    VALUES ('Lareina Harrington',2,'2001-03-22'),
    VALUES ('Carl Espinoza',1,'1999-01-01'),
    @@ -54,7 +54,7 @@ INSERT INTO testovoe.`user` (name,gender_id,birthdate)
    VALUES ('Matthew Casey',1,'2000-10-25'),
    VALUES ('Baxter Thornton',1,'1998-06-09');
    INSERT INTO testovoe.phone_number (`number`,user_id)
    INSERT INTO db.phone_number (`number`,user_id)
    VALUES ('(667) 281-8687',1),
    VALUES ('1-922-306-2043',2),
    VALUES ('1-232-249-6217',3),
  9. BrightMilk revised this gist Jul 24, 2022. 1 changed file with 76 additions and 1 deletion.
    77 changes: 76 additions & 1 deletion B2BC_Task_1.md
    Original file line number Diff line number Diff line change
    @@ -1 +1,76 @@
    Test
    Решение [задания 1](https://gist.github.com/BrightMilk/057fcaafcdff913ed13c821f29d8fada).

    *SQL*-запрос выглядит следующим образом:

    ```
    CREATE TABLE testovoe.`user` (
    id INT auto_increment NOT NULL,
    name varchar(100) NOT NULL,
    gender_id INT NOT NULL,
    birthdate DATE NOT NULL,
    CONSTRAINT user_PK PRIMARY KEY (id)
    )
    ENGINE=InnoDB
    DEFAULT CHARSET=utf8mb4
    COLLATE=utf8mb4_general_ci;
    CREATE TABLE testovoe.gender (
    id INT auto_increment NOT NULL,
    name varchar(100) NOT NULL,
    description varchar(100) NULL,
    CONSTRAINT gender_PK PRIMARY KEY (id)
    )
    ENGINE=InnoDB
    DEFAULT CHARSET=utf8mb4
    COLLATE=utf8mb4_general_ci;
    CREATE TABLE testovoe.phone_number (
    id INT auto_increment NOT NULL,
    `number` varchar(255) NOT NULL,
    user_id INT NOT NULL,
    CONSTRAINT phone_number_PK PRIMARY KEY (id),
    )
    ENGINE=InnoDB
    DEFAULT CHARSET=utf8mb4
    COLLATE=utf8mb4_general_ci;
    ALTER TABLE testovoe.`user` ADD CONSTRAINT user_FK FOREIGN KEY (gender_id) REFERENCES testovoe.gender(id);
    ALTER TABLE testovoe.`phone_number` ADD CONSTRAINT phone_number_FK FOREIGN KEY (user_id) REFERENCES testovoe.`user`(id);
    INSERT INTO testovoe.gender (name,description)
    VALUES ('male','Мужчина'),
    VALUES ('female','Женщина');
    INSERT INTO testovoe.`user` (name,gender_id,birthdate)
    VALUES ('Yvonne Mcdowell',2,'1979-10-09'),
    VALUES ('Lareina Harrington',2,'2001-03-22'),
    VALUES ('Carl Espinoza',1,'1999-01-01'),
    VALUES ('Mallory Buck',2,'2002-12-02'),
    VALUES ('Althea Morton',2,'2001-09-17'),
    VALUES ('Shannon Fry',2,'1992-07-12'),
    VALUES ('Chaim Rogers',1,'2002-11-11'),
    VALUES ('Rachel Payne',2,'2001-08-13'),
    VALUES ('Matthew Casey',1,'2000-10-25'),
    VALUES ('Baxter Thornton',1,'1998-06-09');
    INSERT INTO testovoe.phone_number (`number`,user_id)
    VALUES ('(667) 281-8687',1),
    VALUES ('1-922-306-2043',2),
    VALUES ('1-232-249-6217',3),
    VALUES ('1-604-197-3522',4),
    VALUES ('(279) 852-2417',5),
    VALUES ('(218) 766-7412',6),
    VALUES ('(502) 213-6740',7),
    VALUES ('1-344-205-3086',8),
    VALUES ('1-380-420-6513',9),
    VALUES ('(782) 347-5271',10),
    VALUES ('(876) 626-2755',4),
    VALUES ('(846) 528-8542',8),
    VALUES ('1-422-658-7136',2),
    VALUES ('1-168-395-6412',4),
    VALUES ('(451) 437-3685',5),
    VALUES ('1-222-623-1235',2),
    VALUES ('1-713-424-7400',3);
    ```
  10. BrightMilk revised this gist Jul 24, 2022. No changes.
  11. BrightMilk created this gist Jul 24, 2022.
    1 change: 1 addition & 0 deletions B2BC_Task_1.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    Test