Нормализация от 1НФ до 3НФ - PullRequest
       15

Нормализация от 1НФ до 3НФ

0 голосов
/ 06 сентября 2018

Если у меня есть следующая таблица, которая в настоящее время в 1NF:

enter image description here

Мне необходимо разложить эту таблицу на 3NF.

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

Customer(Customer ID-PK, Customer Name)
Branch(Branch ID-PK, Branch Name, BSB)
Account(Account Type-PK, Account Name)

Что бы у меня было для данных учетной записи? Я думаю что-то вроде:

Account Details (Account Number, Customer ID, Branch ID, Account Type, Account Balance)

Я застрял на том, что сделать первичным ключом этой главной таблицы, так как на один номер счета приходится несколько клиентов.

Нужно ли мне использовать составной первичный ключ с номером счета и идентификатором филиала?

Какие еще / лучшие варианты у меня есть здесь?

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

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

Customer(PK, CustomerName)
Account(PK,AccountId,...)
AccountMapping(PK,(Account.PK/Customer.PK) AS FOR,(Account.PK/Customer.PK) AS TO)
0 голосов
/ 07 сентября 2018

Я предполагаю, что моделируемая организация является банком.

Учитывая данные примера, кажется, что ID ветви, Имя ветви и BSB все связаны с определенной веткой, и каждый из столбцов является ключом-кандидатом (может быть «первичным ключом»).

Одна из таблиц 3NF должна быть:

Branch:  Branch ID, Branch Name, BSB — Branch ID nominated as PK

Для каждого клиента записываются только два бита данных: имя клиента и его идентификатор клиента. Поскольку имена могут повторяться, мы будем считать, что идентификатор клиента является ключом-кандидатом.

Одна из таблиц 3NF должна быть:

Customer: Customer ID, Customer Name — Customer ID nominated as PK 

Учитывая, что первые две строки данных и последние все идентифицируют / c 9047 1234, но информация о типе счета отличается, номер / c не является уникальным во всех отделениях банка. На основании представленных данных комбинация номера счета и идентификатора филиала должна быть уникальной (и, следовательно, PK) Однако одним и тем же аккаунтом могут пользоваться несколько клиентов - первые две строки данных.

Следовательно, одна из таблиц 3NF должна быть:

Account: Account Number, Branch ID, Account Type, Account Balance, Account Type, Account Name
— PK(Account Number, Branch ID)

А другой должен отслеживать клиентов, связанных с данным номером счета. Опять же, показанная таблица - «все ключи», где Account Number и Branch ID образуют один внешний ключ, а Customer ID - другой.

Account_Customers: Customer ID, Account Number, Branch ID

Итак, я думаю, вам нужно 4 таблицы. Столбцы первичного ключа отмечены звездочкой.

  • Филиал: ID филиала *, Название филиала, BSB
  • Заказчик: идентификатор клиента *, имя клиента
  • Учетная запись: номер счета *, идентификатор филиала *, тип учетной записи, остаток на счете, тип учетной записи, имя учетной записи
  • Account_Customers: идентификатор клиента *, номер счета *, идентификатор филиала *
0 голосов
/ 06 сентября 2018

Вы можете создать структуру следующим образом,

Customer(Customer ID-PK, Customer Name)
Branch(Branch ID-PK, Branch Name, BSB)
Account(Account ID-PK, Account Number, Account Name, Branch ID, Account Type, Account Balance)
Account_Customer ( Account_Customer_id-PK, Account id, Customer ID)

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

...