2016-06-15 4 views
1

У меня есть сайт публикаций с различными типами (обычный, тип 1, тип 2), и для каждого типа требуются специальные данные.Рекомендации по хранению метаданных публикаций в MySQL [PHP]

Мой вопрос:

Что такое лучший способ сохранить эти «специальные данные» в базе данных?

1) Создайте таблицу для каждого типа публикации.
2) Создайте таблицу «posts_metadata» со столбцами «post, key, value» и сохраните все типы в них.
3) создать столбец «metadata» в таблице «posts» и сохранить в нем «специальные данные» с использованием формата JSON.
4) создать столбец «metadata» в таблице «posts» и сохранить в нем «специальные данные» с использованием формата XML.

Что вы считаете наиболее эффективным и практичным вариантом?

Изменить # 1:

Пример данных:

Нормальный: without "special data"

Тип 1:

'trademark' => 'Volkswagen' 
'model' => 'gol 1.6' 
'color' => 'white' 
'doors' => '3' 
'kms' => '17000' 
..etc.. 

Тип 2:

'color' => 'green' 
'size' => '15x10' 
'status' => 'new' 
..etc.. 

... Другие типы ...

+0

gonna need some examples data – bassxzero

+0

@bassxzero отредактировал – Manux22

ответ

1

Если вы хотите, чтобы иметь возможность запросить на эти специальные поля данных выберите вариант 2.

Если вы хотите только для хранения данных, выберите вариант 3. В зависимости от возможный размер данных, которые я создал бы для него дополнительную таблицу, и в зависимости от вашей версии mysql укажите столбец json-datatype, если вам нужна проверка и т. д. https://dev.mysql.com/doc/refman/5.7/en/json.html.

Не используйте параметр 4, по сравнению с json xml создает слишком много накладных расходов и не добавляет никакой пользы в этом сценарии.

+0

Но, если мне нужно хранить 10 "специальных данных", мне нужно будет сделать 10 запросов 'INSERT', это хорошая практика? – Manux22

+0

Это обычная практика. Будет хорошей практикой, если вы будете использовать [подготовленные заявления] (http://php.net/manual/en/pdo.prepare.php) для вставки данных, так как база данных будет только разобрать запрос один раз, а затем вы можете просто выполнить проанализированный запрос еще раз с другими вашими значениями. Другим способом было бы использовать многопользовательскую вставку, вам просто нужно было бы создать оператор insert, который выглядит так: «INSERT INTO table (column) VALUES (1) (2) (3)». Преимуществом варианта 2 является простота удаления, обновления и выбора этих полей. – Philipp

+0

Используя параметр 2, у меня проблема с обновлением, если ключ существует, я должен его обновить, а если он не существует, я должен вставить его, но проблема в том, что я не могу определить существующие ключи, и я не могу установить 'meta_key' как UNIQUE, потому что его можно повторить в других строках post ... – Manux22

Смежные вопросы