Подтвердить что ты не робот

Массивы против таблиц (PHP/MySQL)

Встречайте Джимми. Он сделал свою новую жизненную цель, чтобы доказать, что шоколад - лучший аромат мороженого. Для этого он создал простую форму с переключателями и текстовое поле для имени, чтобы он мог отправить ссылку своим друзьям.

enter image description here

Он использует очень распространенную конфигурацию MySQL и PHP для сохранения представлений форм в таблице, которая выглядит так:

enter image description here

selection является идентификатором вкуса. Ароматизаторы хранятся в массиве PHP, потому что он планирует использовать список предпочтений на будущих страницах:

$flavors = array(
   1=>"Chocolate",
   2=>"Cherry",
   ....
);

Форма была успешной, и его друзья начали просить Джимми добавить новые варианты, поэтому Джимми решил перейти на следующий уровень и добавить в форму страну, возраст, электронную почту и другие вещи, но на этот раз он сомневается в том, лучше ли добавлять имена аромата, страны, возрасты и другие статические данные в массивы или сохранять каждую из них в таблице базы данных, он знает, как делать соединения в запросах в любом случае.

Первый подход

будет означать наличие файла PHP со многими массивами и доступ к нему каждый раз, когда Джимми нуждается в названии аромата:
$query = mysql_query("SELECT name, flavor FROM votes")
while($row = mysql_fetch_assoc($query)){
   echo $row["name"]." - ".$flavors[$row["flavor"]];
}

Второй подход

будет означать наличие множества таблиц в базе данных и необходимость выполнять соединение каждый раз, когда ему потребуется такое имя:
$query = mysql_query("SELECT name, flavor FROM votes LEFT JOIN flavors 
WHERE votes.flavor = flavors.flavor");

while($row = mysql_fetch_assoc($query)){
   echo $row["name"]." - ".$row["flavor"];
}

Несмотря на то, что, по-видимому, мало различий, это важное решение для Джимми, поскольку он хочет построить в будущем все больше и больше форм.

Как лучше всего Джимми обрабатывать статические данные, такие как имена вкуса, страны, возрастные группы и т.д., которые связаны с идентификаторами в базе данных?

Данные о состоянии окружающей среды:

  • Массивы статичны и почти никогда не изменятся.
  • Он будет использовать данные на нескольких страницах, поэтому жесткое кодирование не удобно.
  • Добавление нового массива обычно быстрее

Заранее благодарим за помощь.

4b9b3361

Ответ 1

Думаю, Джимми должен думать о том, как он хочет выложить свои данные. Зачем ограничивать его завоевание вкусами.

Если Джимми хочет хранить много мелких битов данных, базы данных - это путь. Если Джимми хочет сохранить изображения элементов, они должны быть сохранены в файлах, и он должен сохранить их относительное местоположение в какой-либо корневой каталог в базе данных

Возможно, одна таблица может содержать:

VOTE_ITEMS
    ID - PRIMARY KEY
    NAME
    IMAGE
    TAGS - (Maybe an imploded ID array with the IDs pointing to a TAG table)
    ...

Другая таблица может содержать:

USERS
    ID - PRIMARY KEY
    ...
    (As much information as your want to collect from your users)
    ...

На голосование:

POLLS
    ID
    VOTE_ITEM_IDS
    ...

USER_VOTES
    POLLS_ID
    VOTE_ITEM
    USER_ID

Поскольку Jimmy, похоже, много знает о базах данных, в любое время, когда он хочет что-то добавить, он может просто добавить еще один столбец (или таблицу) в зависимости от его потребностей. Кроме того, если мы обертываем слабую пользовательскую систему, он может повторно использовать ее в других проектах в будущем!

Ответ 2

Второй вариант, конечно, более масштабируемый и почти лучший в каждом аспекте, единственным аргументом может быть производительность, учитывая, что его данные в конечном итоге станут действительно большими. Но даже в этот момент jimmy может легко кэшировать результат из новой таблицы flavors, используя такую ​​технологию, как memcache, x-cache или даже написать код, который будет динамически создавать файл php с массивом ароматов, используя базу данных ароматизаторов. Я очень смущен, почему кто-то с вашей репутацией задаст такой вопрос?!

Ответ 3

Я стараюсь хранить такие значения в таблицах db, главным образом, чтобы их можно было модифицировать с помощью CMS. Затем я получаю их все сразу, только один раз, в начале моего PHP-кода, в глобальном массиве... например. $glob ['flavors'], $glob ['cities'] и т.д. Тогда это так же просто, как...

    foreach ($person) {
        echo 'Their flavor = '. $glob['flavors'][$person['flavor_id']];
    }

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

Преимущества этого: только один поиск db, глобальный доступ. Недостатки этого: память hog, если массив огромен