2013-05-17 2 views
2

У меня есть стол под названием автомобили, но у каждого автомобиля есть сотни атрибутов, и они продолжают расти с течением времени (лошадиная сила, крутящий момент, а/с, электрические окна и т. Д.). Моя таблица имеет каждый атрибут в виде столбца. Это правильный способ сделать это, когда у меня есть тысячи строк и сотни столбцов? Кроме того, я сделал каждый атрибут столбцом, чтобы облегчить расширенный поиск/фильтрацию.Как создать базу данных, когда вам нужно слишком много столбцов?

Использование MySQL базы данных.

Благодаря

+1

А как насчет использования NoSQL DB, как MongoDB. Это позволит вашей схеме легко меняться (добавляя новые атрибуты). – danieln

ответ

4

Это интересный вопрос, ИМХО, и ответ может зависеть от конкретной модели и реализации данных. Важнейшим фактором в этом случае является плотность данных.

Сколько каждой строки на самом деле заполнена, в среднем?

  • Если большинство ваших полей всегда присутствуют, то данные сфера раздела может быть путь.
  • Если большинство ваших полей пустым, то метаданные -как структура (как @JayC предложил) может быть более привлекательным.

Давайте воспользуемся случаем, о котором вы упомянули, и выполните некоторые симуляции.

В первом случае, область раздела, идея заключается в реализации разделов на основе объема или использования. В качестве примера разбиения на использование, скажем, что наиболее загруженные поля - это Model, Year, Maker и Color. Эти поля могут составлять ваш основной [CAR] стол, владелец поля идентификатора, который будет идентифицировать автомобиль исключительно. Теперь предположим, что двигатель, лошадиная сила, крутящий момент и цилиндры также используются для поиска время от времени, но не так часто. Они могут существовать на вторичной таблице [CAR_INFO_1], которая привязана к первой таблице наличием поля CAR_ID, внешнего ключа. Продолжайте создавать столько разделов, сколько вам нужно.

Advantage: Простые запросы. Вы можете объединить всю информацию об автомобиле, если вы выполняете совместный запрос (например, внутри VIEW).

Недостатком: Техническое обслуживание. Каждое новое поле должно быть реализовано в самой модели, и вам необходимо обновить модель данных, чтобы найти, где поле вам нужно на самом деле хранятся (или абстрагировать внутри вида.)

Метаданных формата гораздо более изящный, но требует больше вашего механизма базы данных. Проверьте ответы @ JayC и @Nitzan Shaked за подробностями.

Преимущества: 100% плотность данных. У вас никогда не будет пустых значений данных. Также обслуживание - новый атрибут создается путем добавления его в виде строки в таблицу идентификаторов метаданных. Структура данных также менее сложна.

Недостаток: Комплексные запросы, а также более сложные планы выполнения. Предположим, вам нужны все автомобили Ford, сделанные в 2010 году, которые являются синими. Было бы очень тривиально на первом случае:

SELECT * FROM CAR WHERE Model='Ford' AND Year='2010' AND Color='Blue' 

Теперь тот же самый запрос на метаданных структурированной модели:

допускаем существование этих двух таблиц,

CAR_METADATA_TYPE 
ID DESC 
1 'Model' 
2 'Year' 
3 'Color' 

и

CAR_METADATA [CAR_ID], [METADATA_TYPE_ID], [VALUE] 

Запрос сам хотел бы что-то вроде этого:

SELECT * FROM CAR, CAR_METADATA [MP1], CAR_METADATA [MP2], CAR_METADATA [MP3] 
WHERE MP1.CAR_ID = CAR.ID AND MP1.METADATA_TYPE_ID = 1 AND MP1.Value='Ford' 
AND MP2.CAR_ID = CAR.ID AND MP2.METADATA_TYPE_ID = 2 AND MP2.Value='2010' 
AND MP3.CAR_ID = CAR.ID AND MP3.METADATA_TYPE_ID = 3 AND MP3.Value='Blue' 

Итак, все зависит от ваших потребностей. Но, учитывая ваше дело, мое предложение было бы форматом метаданных.

(Но сделать модель очистки первый - нет повторяющихся полей, 1: N данные об их собственной таблице вместо встроенных полей, как Color1, COLOR2, color3, такого рода вещи;))

4

Я думаю, очевидный вопрос, то: почему нет таблицы car_attrs (автомобиль, атр, значение)? Каждый атрибут представляет собой строку. Большинство запросов можно переписать для использования этой формы.

+0

I второй это. Я использую эту схему в нескольких dbs, где даже тип продуктов не может быть указан, например, в вашем примере. Это хорошее и самое быстрое решение, а также масштабируемое. – kms

-2

Если вы когда-либо изменение атрибутов, а затем рассмотреть их хранения в сгустке XML или структуре текста в одной колонке. Эта структура не является реляционной. Наиболее важные атрибуты будут дублироваться в дополнительных столбцах, чтобы вы могли обрабатывать запросы для поиска по ним, поскольку Blob не будет доступен для поиска из SQL-запросов. Это сократит количество столбцов в этой таблице и позволит расширять без изменения схемы базы данных.

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

2

Если это все о возможностях, создать features таблицу, список всех функциональных возможностей как строки и дать им какой-то автоматический идентификатор, и создать car_features что с внешними ключами в оба ваши cars таблицы и ваш features стол что ассоциирует автомобили с особенностями, возможно, наряду с любыми значениями, связанными с отношением (одно пассажирское электрическое сиденье и т. д.).