2016-10-16 2 views
2

У меня есть сайт аренды автомобилей PHP/MYSQL. В таблице MYSQL я хранитьКак нормализовать базу данных MySQL

  1. автомобильных номерные знаки
  2. автомобиля спецификации (как AC, марка и такие)
  3. цены за день (30 colums), так как цена за 1 день X евро в день, и за 30 дней, скажем, составляет 1 евро в день
  4. страхование в день (это за автомобиль , потому что это зависит от конкретной истории автомобиля, год, ), модель, модель и т. д.). Так, так как есть 30 дней в месяц, мы есть здесь еще 30 столбцов, так как страхование за 1 день <> страховой в течение 28 дней, скажем

Теперь, если я положил все эти вещи в меня будет о 70 колоний. Любые более умные способы сделать это, чтобы избежать удара производительности? Я не контролирую цены, и нет ежедневной цены или ежедневной формулы страхования.

Один идеей будет использование автомобильных табличек в качестве индекса и удар в 2 стола, один с ценами (35 строк), один со страховкой (35 строк). Любой другой?

БД имеет 1000 автомобилей или около того. Я получаю около 10.000 запросов в день в БД

Доброго спасибо.

+1

'цена за день (30 номеров)' ... это не будет хорошо масштабироваться, если у вас более 30 дат. Вместо этого измените даты на запись (строку). –

+1

Этот вопрос немного широк, чтобы ответить, и некоторые вещи неясны (по крайней мере, для меня). Но да, общая идея нормализации/реляционных баз данных заключается в создании отдельных таблиц, как вы уже говорили. Однако можно ли арендовать автомобиль только на срок до 30 дней? Я думаю, вам нужно тщательно подумать о том, что именно вы подразумеваете под ценой в день. Я не могу себе представить, сколько дней в месяц является ограничивающим фактором для аренды автомобиля. Или это? –

+0

1000 и 10000 и 35 и 35 * 1000 являются «крошечными» числами. У вас нет проблем с размером и производительностью (при условии, что у вас есть подходящие индексы). –

ответ

2

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

Select brand,type,ac,seats FROM cars 
LEFT JOIN prices ON cars.id = prices.car_id 
LEFT JOIN insurence_costs ON cars.id = insurence_costs.car_id 
WHERE 
    licensePlate = 'HH-OH-234' 
    AND prices.days = 28 
    AND insurence_costs.days = 28 

Обновление: Добавлено номерные знаки. Я бы просто поместил их в автомобильные спецификации. В целом, они связаны с автомобилем, но могут измениться в будущем. Если они меняются довольно часто, я бы скорее переместил их в специальный стол. MySQL Workbench Sheet Screenshot

Я бы фактически сэкономил цену за день аренды в зависимости от общего диапазона аренды до дБ. Таким образом, вы могли бы сделать что-то вроде

SELECT price FROM prices 
WHERE car_id = 123 AND days = MAX(days); 

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

+0

Снимок экрана был взят из [MySQL Workbench] (http://dev.mysql.com/downloads/workbench/). – Hafenkranich

+0

Возможно, стоит совместить 'prices' и' insurance_costs', так как вы почти всегда смотрите на два значения для _same_ числа дней? (Отдельная таблица с двумя числовыми столбцами) –

+1

Do _not_ использовать 'FLOAT (m, 2)' - он включает дополнительное округление, которое может вызвать проблемы. Перейдите в 'DECIMAL (m, 2)'. –

0

Чтобы нормализовать базу данных (или более общую для разработки базы данных), вы должны четко определить объекты, которые у вас есть.

Из вашего описания, у вас есть четыре сущности следующим образом:

  1. автомобилей
  2. Спецификация
  3. Цена
  4. Страхование

Каждый субъект выше должен имеет таблицу обрабатывать его свойства (столбцы).

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

  1. Автомобиль: на одном автомобиле должна быть одна спецификация, цена и страховка. то есть отношение одно к одному. Таким образом, таблица автомобилей должна иметь столбцы спецификация_id, price_id и insurance_id, которые связывают ее с тремя другими таблицами.

  2. С другой стороны, другие три таблицы (сущности: спецификации, цена и страхование) могут иметь много автомобилей, поэтому его отношение к автомобилю одно для многих, и оно покрывается определением внешних ключей в таблице автомобилей (спецификация_id , price_id и insurance_id)

Как он мог работать?

Перед тем, как вставить новый автомобиль, вы должны заполнить другие объекты. Другими словами, список доступных, спецификаций, цен, страховок должен быть найден в респектабельных таблицах (лицах), и если у вас есть новый автомобиль, который не имеет ни одного определенного из них, тогда вам нужно создать новый объект, который покрывает его потребность перед вставкой или созданием. введя новую спецификацию и/или новую цену и/или новую страховку, которой должен принадлежать автомобиль.

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

+0

Спасибо всем ребятам за превосходные ответы! – Christina

+0

1 и 2 должны быть одним столом, я бы сказал, потому что спецификации являются частью самого автомобиля и постоянно связаны с одним воплощением автомобиля. – Hafenkranich

+0

@Hafenkranich Я так не думаю, спецификации в таких системах являются независимыми объектами, которые могут передаваться через другие объекты. Например, предположим, что у этого агентства есть два одинаковых автомобиля, то есть две модели BMW i7 2015. Что вы имеете в виду, это особая единица автомобиля, такая как номера двигателя и шасси, которые могут быть добавлены в автомобиль. – SaidbakR