2015-10-07 5 views
0

Я имею предлагаемую структуру таблицы, чтобы расширить базу данных:SQL - нормализация базы данных

Proposed table structure

в пределах OrganisationalAssets таблицы. Следующие столбцы обнуляемые:

  • Organisation_Id
  • LOCATION_ID
  • LANGUAGE_ID

Проблемы мы столкнулись в том, что Organisation_Id колонна обнуляемая только для определенных видов активов. Некоторые активы относятся к Организации, а некоторые никогда не будут. Для тех, которые относятся к Организации, применяются другие столбцы, местоположение и язык. Если Организация NULL. Тогда Язык и Местоположение являются избыточными столбцами для этих активов.

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

Однако я не совсем уверен, как изменить структуру, чтобы отразить это. Независимо от того, являются ли они внутренними или внешними активами, у них все еще может быть много связанных с ними AssetSettings. Внешние активы будут иметь другой набор AssetSettings, зависящий от там Organization, Location_Id и Language_Id, тогда как внутренний актив не будет. У них будет только один набор настроек.

Я не уверен в том, чтобы:

  1. Просто оставьте структуру, как это происходит потому, что она работает. Хотя это не нормируется правильно.
  2. Попытка и реструктуризация таблиц, позволяющих использовать оба типа активов, и если да, то каким образом.

Выборочные данные Вот некоторые примеры данных, мы надеемся сделать немного больше смысла того, что я спрашиваю:

OrganisationAssets

+----+----------+-----------------+-------------+-------------+ 
| Id | Asset_Id | Organisation_Id | Location_Id | Language_Id | 
+----+----------+-----------------+-------------+-------------+ 
| 1 |  1 | 2    | 3   | 4   | 
| 2 |  1 | 2    | 3   | 999   | 
| 3 |  2 | NULL   | NULL  | NULL  | 
+----+----------+-----------------+-------------+-------------+ 

Первые два ряда для AssetId 1. Он относится к двум различным местоположениям и является Внешним актив. Третий ряд - Внутренний актив, поэтому другие столбцы являются избыточными.

AssetSettings

+----+------------------------+------+--------+ 
| Id | OrganisationalAsset_Id | Key | Value | 
+----+------------------------+------+--------+ 
| 1 |      1 | Key1 | Value1 | 
| 2 |      1 | Key1 | Value1 | 
| 3 |      2 | KeyA | ValueA | 
| 4 |      3 | KeyB | ValueB | 
+----+------------------------+------+--------+ 

В таблице AssetSettings. Мы можем увидеть два набора параметров для Asset с Id1 (т. Е. OrganisationalAsset_Id 1 и 2). Мы также можем увидеть второй актив, отображаемый в таблице, и он может иметь только одну группу настроек, поскольку он не принадлежит ни к какой организации, местоположению или языку.

+0

Одна рекомендация, которую я хотел бы сделать, - это прекратить использовать ID в качестве имени столбца в любой таблице. Если это OrganizationID, то это должно быть в каждой таблице. Идентификатор слишком неоднозначен imho, а столбец, который изменяет имена между таблицами, просто ужасен для работы. –

ответ

0

1) Это кажется разумным, это выбор между избыточностью и простотой, понимание данных, использование и т. Д. Поможет вам в этом решении.

2) Как вы определили два различных вида Assets почему бы не моделировать его как такой

Assets (Id, Name, AssetType_Id) 
    -- Id is PK 

AssetTypes (Id, Name) 
    -- Id is PK 

InternalAssets (Id, AssetSettings_Id) 
    -- Id is PK and FK referencing Assets(Id) 
    -- AssetSettings_Id is FK referencing AssetSettings 

ExternalAssets (Id, Asset_Id, AssetSettings_Id, Organisation_Id, Location_Id, Language_Id) 
    -- Id is PK 
    -- Asset_Id is FK referencing Assets(Id) 
    -- AssetSettings_Id is FK referencing AssetSettings 

AssetSettings (Id, Setting1, Setting2, Setting3) 
    -- Id is PK 

Вы можете добавить ограничение таким образом, что InternalAsset не может быть ExternalAsset и наоборот.

Вы также можете создать вид OrganisationalAssets, который объединил бы две таблицы *Assets, которые могут помочь упростить запрос.

+0

Моя единственная проблема с этим - таблица AssetSettings. если у меня есть один Asset (в таблице Assets), и он принадлежит к одной и той же Организации и местоположению, но имеет два разных языка (в ExternalAssets, поскольку он один ко многим). Это означает, что у меня могут быть два набора AssetSettings, по одному для каждого ExternalAsset. Один для местоположения x и один для местоположения Y. Когда я пытаюсь получить AssetSettings для местоположения X, я не могу, поскольку AssetSettings не понимает концепцию ExternalAsset. – JBond

+0

Я думаю, что эту проблему можно решить, не используя таблицу EAV для 'AssetSettings', см. Мой обновленный ответ. –

1

Ну, как я могу видеть из структуры вы описали лучшее решение для нормализации ваших данных в ход все из этих 3-х полей (Organisation_Id, LOCATION_ID, LANGUAGE_ID) в [AssetSettings] таблица. В этом случае вы избегаете иметь значения NULL для ненадлежащих активов, и вы всегда можете ссылаться на требуемое поле где угодно и когда захотите.

И вы можете полностью удалить OrganisationalAsset стола и ссылку AssetSettings стола прямо активов таблицы.

И вы до сих пор все активы в один таблицы, так что вам не придется разделить их в двух таблиц, в которых наиболее распространенной проблемой для возникающих оказывает два ID поля для активов , поэтому вам нужно будет сохранить дополнительное поле AssetType для каждой таблицы, содержащей AssetId.

+0

Я могу это сделать. Однако я просто переместил проблему в таблицу AssetSettings? Для тех активов, которые никогда не ассоциируются с организацией/языком/местоположением, он всегда будет NULL. Однако для Внешних активов Организация всегда требуется. Я обновил свой вопрос с помощью некоторых выборочных данных. – JBond

+0

Извините, это, наверное, моя ошибка, не объясняя это хорошо. Я не хотел их перемещать КАК ЕСТЬ, я имел в виду, что вы должны иметь [Key] = Organisation_Id и соответствующее значение для тех активов, которые имеют такую ​​информацию. Я не хотел добавлять новые поля в таблицу. – GSazheniuk

+0

Итак, если ваш объект №1 имеет Organisation_Id, он будет иметь соответствующую строку в таблице AssetSettings - Id = Identity, OrganisationalAsset_Id = 1, [Key] = Organisational_Id, Value = 149.Если у него есть значение Language_Id - другая строка, Id = Identity, OrganisationalAsset_Id = 1, [Key] = Language_Id, Value = 3 – GSazheniuk

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