2016-11-11 3 views
1

Допустим, у меня есть две таблицы, одна из которых хранит автомобили с внешним ключом во второй справочной таблице, в которой хранятся бренды. Что лучше ... создать enum и сделать свойство автомобиля типом перечисления или загрузить список объектов бренда из таблицы?Должен ли я хранить ссылочные таблицы vales как перечисление?

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

Какая хорошая практика?

`Car { 
int SerialNumber; 
(int or enum?) BrandId; 
string Owner; 
DateTime Year; 
}` 

`(class or enum?) Brand { 
int Id; 
string Name; 
}` 
+0

Вы используете ORM, как EntityFramework? –

+0

Рассчитайте расходы на «переустановку» программного обеспечения, когда вам нужно добавить новый бренд, а также несколько дополнительных запросов на сервер sql. – Fabio

+0

У вас действительно есть проблемы с производительностью при реализации, где вы делаете запрос базы данных для проверки брендов? Что такое назначение базы данных, тогда, если вы хотите сохранить данные жестко закодированными в вашем исходном коде? Используйте базу данных, и только если у вас проблемы с производительностью (я сомневаюсь), вы начинаете рассматривать другой подход. – Fabio

ответ

1

Я бы держался подальше от enum в MySQL; добавление нового значения в поле перечисления требует ALTER TABLE, который требует иногда дорогостоящей реконструкции всей таблицы.

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

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

Один последней вещь, чтобы рассмотреть против перечисления: Если у вас есть несколько различных клиентов, вам нужно будет держать перечисление синхронизированного через кодовую базу всех клиентов.

0

Если у вас есть бизнес-логика, которая отличается от разных брендов, лучше бы ее поместить в код. Чтобы убедиться, что идентификатор для определенного бренда равен во всех базах данных. В этом случае проверьте рефакторинги типа «заменить код типа на подклассы». Если вы не используете идентификатор в своем коде для изменения какой-либо логики, вы можете поместить бренды в базу данных. Вы можете кэшировать значения для повышения производительности. Я думаю, что бренды не так часто меняются.

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