Как спроектировать мои таблицы базы данных ингредиентов? - PullRequest
1 голос
/ 27 декабря 2011

Я работаю над модулем рецептов (ASP.NET MVC, структура сущностей, сервер sql), и одна из сущностей, которые мне нужно настроить в базе данных, - это ингредиенты, их характеристики и переводы на ряд языков.

Я думал о создании двух таблиц следующим образом:

Table Ingredient
     Id, nvarchar(20), primary key
     EnergyInKCal, float
     ... other characteristics
     Source, nvarchar(50)

Table IngredientTranslation
     Id, nvarchar(20), primary key
     LanguageCode, nvarchar(2)
     Name, nvarchar(200)

Таким образом, каждый ингредиент будет определен один раз в таблице ингредиентов с уникальным кодом в качестве их первичного ключа, например:

 'N32-004669', 64, 368, 'NUBEL'

и переведено в таблицу IngredientTranslation, например

* * 1010

Я думаю, что запрос к ингредиентам становится таким простым ... как вы думаете, будет ли хорошей идеей использовать код (который является nvarchar (20)) в качестве первичного ключа? Или просто bigint лучше, но тогда я должен использовать JOINS в своих запросах. Может быть, другие подходы, которые лучше - производительность мудрее?

РЕДАКТИРОВАТЬ: после прочтения ответов я изменил таблицы следующим образом:

Table Ingredient
     Id, bigint, primary key
     ExternalId, nvarchar(20)
     EnergyInKCal, float
     ... other characteristics
     Source, nvarchar(50)

Table IngredientTranslation
     Id, bigint, primary key
     IngredientId, bigint (relation with Id of Ingredient table)
     LanguageCode, nvarchar(2)
     Name, nvarchar(200)

Спасибо, L

Ответы [ 2 ]

2 голосов
/ 27 декабря 2011

Поскольку первичный ключ включен во все остальные индексы, лучше всего сохранять первичный ключ небольшим. Так что int identity - отличный выбор.

Примечание с одной стороны: хранение переводов в базе данных оказывает довольно ощутимое влияние на производительность. И в базе данных, и в движке рендеринга, который должен создавать веб-страницу. Поскольку переводы довольно постоянны, большинство сайтов хранят их вне базы данных. В ASP.NET типичным выбором будут файлы ресурсов.

1 голос
/ 27 декабря 2011

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

Пара дополнительныхпримечания:

  • Первичный ключ в IngredientTranslation должен быть составным ключом для идентификатора и кода языка, а не только для идентификатора.
  • Из первой нормальной формы: удалить производные значения.Таким образом, вам нужно только одно поле для энергии - выберите одну из энергетических единиц (кДж или ккал) и используйте соответствующий коэффициент умножения для преобразования в случае необходимости.

РЕДАКТИРОВАТЬ: в альтернативном сценарии я предлагаю добавитьуникальный индекс для каждой из таблиц Ingredient (в коде) и IngredientTranslation (в коде и коде языка).Я также предлагаю переименовать поле кода как IngredientCode в таблице IngredientTranslation.

...