Вставить массив в базу данных в одну строку - PullRequest
8 голосов
/ 09 октября 2008

Интересно, будет ли это выполнимо? Чтобы вставить массив в одно поле в базе данных.

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

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

Я просто хочу что-то подобное

ID      TITLE
1       Array("english title", "nederlandse titel");

Я использую PHP / MSYQL, поэтому, если это будет выполнимо, объясните, пожалуйста, на этих языках.

О да, я подумал, что мог бы отформатировать его в стиле фанк и использовать функцию split, чтобы снова превратить его в массив. Но мне интересно, смогу ли я просто сохранить его как массив сразу, в случае, если пользователь может напечатать что-то с таким же форматированием (один из миллиона)

Ответы [ 4 ]

15 голосов
/ 09 октября 2008

это выполнимо:

$title = serialize($array);

и затем декодировать:

$title = unserialize($mysql_data);

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

edit: хорошая точка, упомянутая dcousineau (см. Комментарии)

Иногда сериализованный вывод, даже после экранирования, выбрасывает символы в запрос, что приводит к ошибкам. Вы можете заключить ваш serialize () в вызовы base64_encode () и затем использовать base64_decode () перед десериализацией.

скорректированный код для этих ситуаций:

$title = base64_encode(serialize($array) );
$title = unserialize(base64_decode($mysql_data) );
6 голосов
/ 09 октября 2008

Здесь есть только два разумных варианта:

Присоединиться к другому столу
плюсы: неограниченное количество названий на неограниченных языках
минусы: затраты на объединение требуют больших вычислительных ресурсов, SQL немного сложнее для обновления / вставки и т. д.

Несколько столбцов
например: TITLE_EN, TITLE_NL, TITLE_DE
плюсы: быстро вставлять, выбирать и т. д.
минусы: ограниченное количество языков, добавление больше - ALTER TABLE

Учитывая наши два варианта, вам обычно следует выбрать первый. Если вы не имеете дело с просто неприличным количеством транзакций, которые нельзя распараллелить, или вы absosmurfly можете быть уверены, что вы никогда не добавите языки, дополнительная гибкость в макете схемы избавит вас от головной боли в долгосрочной перспективе.

2 голосов
/ 09 октября 2008

Массивы нарушают нормализацию; в моем опыте работы с базами данных интернационализации я обнаружил, что нормализация фраз - лучший дизайн,

Я позволяет вам легко делать оптовые копии строк - например, «es» - «es-mx» или «en» - «en-US», «en-GB» и мой любимый: «xx-piglatin» ». В схеме массива вам придется либо переписывать каждую запись, либо добавлять сложный синтаксический анализ, либо использовать что-то более сложное, чем массивы, например XML.

Относительно легко использовать LEFT JOIN s для поиска непереведенных фраз для работы, а также использовать COALESCE для возврата значения по умолчанию, поэтому программа остается пригодной для использования, даже если фраза не переведена.

1 голос
/ 09 октября 2008

Используйте таблицу с 3 столбцами!

ID, TITLE_EN, TITLE_NL

Нет веских причин для сериализации, ДЕЙСТВИТЕЛЬНО!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...