Массивы против таблиц (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"];
}
Несмотря на то, что, по-видимому, мало различий, это важное решение для Джимми, поскольку он хочет построить в будущем все больше и больше форм.
Как лучше всего Джимми обрабатывать статические данные, такие как имена вкуса, страны, возрастные группы и т.д., которые связаны с идентификаторами в базе данных?
Данные о состоянии окружающей среды:
- Массивы статичны и почти никогда не изменятся.
- Он будет использовать данные на нескольких страницах, поэтому жесткое кодирование не удобно.
- Добавление нового массива обычно быстрее
Заранее благодарим за помощь.
Ответы
Ответ 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, если массив огромен