2013-09-09 3 views
-4

Я делаю таблицу продуктов, таких как различные типы транспортных средств: автомобили, грузовики и т. Д. Они изготовлены из множества стран, и в каждой стране есть множество производителей, например, у Японии есть Toyota , Honda и т. Д., А у США есть Ford, GM и т. Д. После того, как база данных построена, мне нужно делать такие операции, как «выбрать все автомобили Toyota».Хранение массива массивов в mysql

Каков наилучший способ его хранения?

+5

Вы должны изучить базовые методы базы данных, особенно [нормализация] (http://en.wikipedia.org/wiki/Database_normalization), и тогда вы сможете сами ответить на это. –

+0

Лучший способ - не использовать массивы. Массивы ужасны в базах данных, если все, что вы делаете, это хранение массивов, вы можете также ссылаться на текстовый файл где-то. Проведите некоторое исследование нормализации данных и как вы хотите хранить данные без использования массивов. (MarcB избил меня до комментария;)) – Twelfth

+0

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

ответ

0

Почему не только есть таблица под названием Автомобили, , а затем строки, как автомобиля, модель, компании, Страна

, а затем вы можете просто

SELECT * FROM Automobiles WHERE Company = 'Toyota' AND Country = 'Japan' 
+0

Спасибо Теодор. Это сработает. Это также означает, что каждый объект данных расширяется в потенциально очень длинную таблицу, верно? Я в порядке с этим, но хочу знать, является ли это стандартным способом. – user2720403

+0

Я не знаю, правильно ли это делать, но в прошлом у меня был столбец типа «Настройки», который в основном поддерживает json-массив. Но есть, вероятно, несколько лучших способов использования sql, я просто их не знаю. –

1

структура данных не обязательно совпадает вашей структуры массива. Ключевым словом является «нормализация»: проектируйте свои таблицы таким образом, чтобы избежать избыточности, и убедитесь, что каждая запись в таблице содержит точно информацию, которая имеет отношение к описанию предмета этой конкретной таблицы.

Возможная структура может быть:

create table vehicles(
vid int auto_increment primary key, 
void int, 
vname nvarchar(32), 
vtype int, 
vmotor varchar(32), ...) 

create table oem (
oid int auto_increment primary key, 
oname nvarchar(32), 
countryid int, ...) 

void В столбце таблицы vehicles ссылается на первичный ключ oid таблицы oem (производителей оригинального оборудования).

Типичный запрос может быть следующим:

select * from vehicles where 
exists (select 1 from oem where oid=void and countryid=7) 

countryid просто целочисленный ключ ссылки еще одну таблицу (не перечисленные здесь), содержащий названия стран и т.д .. Если предположить, что запись 7 из таблицы страны содержит ' Япония ", то в вышеуказанном запросе будут перечислены все транспортные средства, произведенные в Японии.

Или - возвращаясь к исходному примеру -

select * from vehicles where 
exists (select 1 from oem where oid=void and oname='Toyota') 

бы перечислить все транспортные средства этого конкретного производителя.

Этот маленький пример - это только отправная точка для понимания «нормализации». Как и Марк Б уже сказал: Изучите концепцию для себя, и вы сможете сами ответить на свой вопрос. Вот еще одна примерная ссылка, которая может быть полезна: http://db.grussell.org/section008.html.

+0

Хорошее место для меня, чтобы начать. Благодарю. – user2720403

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