За последние 24 часа нас посетили 18955 программистов и 1575 роботов. Сейчас ищут 1697 программистов ...

Хранить в одной таблице или создавать две?

Тема в разделе "PHP и базы данных", создана пользователем viktor72, 8 апр 2017.

  1. viktor72

    viktor72 Активный пользователь

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Есть таблица "Компаниии" у компаний есть атрибуты АО, ООО, ЧП (формы собственности предприятий). Этих атрибутов небольшое стандартное колличество (я насчитал 5 ).
    Создавать дополнительную таблицу форм собственности или все формы хранить в таблице "компании"?
    img-2017-04-08-02-21-36.png
     
  2. Amperandus

    Amperandus Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    226
    Симпатии:
    11
    создаешь поле enum и хранишь в одной. ИМХО конечно.
     
    viktor72 нравится это.
  3. viktor72

    viktor72 Активный пользователь

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    не пробовал. А как выводить в выпадающий список ?
    PHP:
    1.  $sql =  "SELECT форма собственности FROM  компании";
    2. $query = mysqli_query($db, $sql);
    3.  
    4. ?????
    HTML:
    1.  
    2.        while($row = mysqli_fetch_array($query)){
    3.       <option value =$row[ ???   ] >$row['  ???? ']</option>
    4.        }
    5.  
    И как потом значения таблицы инсертитть?

    Для пользователя это должно быть так: создайте новую компанию, выберите из выпадающего списка форму собственности.
    создав компанию из базы выводится : Компания - ООО, "Бука".
    Подскажите.
     
    #3 viktor72, 8 апр 2017
    Последнее редактирование: 8 апр 2017
  4. Amperandus

    Amperandus Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    226
    Симпатии:
    11
    viktor72 нравится это.
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Есть такой паттерн проектирования БД - "справочник". Когда такие вот константные данные, как у тебя, выносятся в отдельную таблицу, а везде, где нужны оттуда строки, мы ссылаемся на строки справочной таблицы по ID.

    Что с этого имеем:
    1) Исключается человеческий фактор при заполнении константных данных. Вот тебе пример: ООО и OOO. Выглядят одинаково. А на деле одно из них некорректно. А может быть все проще, может быть банальная опечатка. И ладно, если это поле просто выводится "как есть", но оно же может участвовать в выборке, и тогда выборка будет некорректной.
    2) Упрощается индексирование колонки, ссылающейся на справочную таблицу.
    3) Выборки по этой колонке будут быстрее. Сравнение чисел всегда работает быстрее сравнения строк или LIKE оператора.
    4) Больше контроля в огромных запросах, которые, вполне возможно, будут.
    5) Таки на руках есть отдельная таблица со списком используемых значений, которая, в отличие от ENUM-типа, расширяемая. Завтра введут новый вид собственности(маловероятно, но все же), и, в случае с ENUM-типом, придется альтить таблицу, хранящую все данные. А тут просто надо добавить одну строчку.

    Минусы:
    1) В простом select * from вместо надписи "ООО" будет число. Лечится JOIN-ами, либо вложенными селектами в запросе. Смотря что больше подходит под конкретную ситуацию.
     
    viktor72 нравится это.
  6. viktor72

    viktor72 Активный пользователь

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Да, вижу что проще использовать лишнюю таблицу. Во всяком случае на моем уровне.
    Статью полезную нашел про enum http://pushorigin.ru/sql/enum-evel основная боль , это корреткно выводить данные из enum , насколько я понял.
    А как мне быть, когда понадобится вносить : "мужчина", "женщина"? вписать в коде в выпадающем списке или тоже таблицу с двумя значениями создавать?
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ну...вероятность появления новых полов чуть ниже вероятности появления новых видов собственности, хотя кто знает, мб у нас трансгендеры отдельный пол заимеют официально через N лет.. Но тут, пожалуй, целесообразно использовать ENUM. Хотя, в общем-то, создание отдельной таблицы, пусть и для двух вариантов, никому жизнь не испортит. Само по себе наличие таблицы в БД ни на чем не сказывается, если ты этого боишься. А вот архитектура БД становится прозрачнее. Те же ENUM-ы не столь очевидны, когда смотришь на диаграмму в том же workBench, из которого ты скинул скриншот.
    --- Добавлено ---
    И да, надеюсь, у тебя кириллические имена таблиц и полей только для скриншота? Если у тебя такое в проекте - то это кррррайне нежелательная хурма. Избегай ее по возможности. Названия лучше писать на латинице. В идеале - на английском. Не знаешь английский, тогда учи хотя бы транслитом. Но либо так либо так. Смешивать транслит с инглишем не надо, даже если будет сильное желание.
     
    viktor72 нравится это.
  8. viktor72

    viktor72 Активный пользователь

    С нами с:
    20 дек 2015
    Сообщения:
    326
    Симпатии:
    6
    Да, это только для примера. На данном этапе у меня хватает знаний чтоб не создавать таблицы названные кириллицей.
    Да здравствуют таблицы! Создам таблицу sex с двумя значениями.
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    с трёмя. От тебя не убудет, если их будет "мэ", "жо" и "прочее", правда? =) зато все буду довольны, даже те, кто тупо не хочет тебе сообщать пол.