Нормализовать ежемесячные платежи

#sql #database #normalization #database-normalization

#sql #База данных #нормализация #база данных-нормализация

Вопрос:

Во-первых, извините за мой плохой английский. Я пытаюсь нормализовать таблицу в пенсионной системе, где подписчикам платят ежемесячно. Мне нужно знать, кому заплатили, а кому нет, и сколько им заплатили. Я полагаю, что я использую SQL Server. Вот пример:

 id_subscriber  id_receipt     year   month     pay_value   payment type_pay
 12               1           2016   January    100          80       1   
 13               1           2016   January    100          100      1 
 14               1           2016   January    100          100      1
 12               2           2016   February   100          100      2
 13               2           2016   February   100          80       1
  

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

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

Это мои другие таблицы:

                            tbl_subscriber
id_suscriber(PK) first_name  last_name  address  tel_1  tel_2
    12             Juan         Perez      xxx     xxx    xxx
    13             Pedro        Lainez     xxx     xxx    xxx
    14             Maria        Lopez      xxx     xxx    xxx 

                           tbl_receipt
id_receipt(PK)      value        elaboration_date  deposit_date 
    1             1,000.00         2015-09-16       2015-09-20
    2             890.00           2015-12-01       2015-12-18 

                          tbl_type_paym
 id               type             description
 1                bank               xxxx
 2              ventanilla            xxx    
  

Комментарии:

1. Будьте более конкретными… Что вы пробовали и что ищете?

2. Отредактируйте свой вопрос и включите примеры данных, желаемые результаты и базу данных, которую вы фактически используете.

3. Ваш вопрос не ясен, Фрэнк.

4. Используйте небольшое значение int для хранения месяца.

5. Может существовать функциональная зависимость, включающая «id_receipt», «год» и «месяц». Неясно, может ли это включать и другие атрибуты. Вы не можете нормализовать это отношение, пока не узнаете функциональные зависимости. Никто из нас не может сказать вам, что такое FD; вы должны сказать нам .

Ответ №1:

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

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

Комментарии:

1. Что такое естественный ключ?

2. @nicomp Ха, ха, ну, я думаю, в этом сценарии у вас будет искусственный ключ. Как я уже сказал, я не вижу никакой пользы в разделении. Но вас ничто не останавливает.

3. Ну, тогда это даже не 1NF.

4. @nicomp Если я чего-то не упускаю, он удовлетворяет первой нормальной форме, если вы не разрешаете использовать несколько строк, имеющих один и тот же месяц и год.

5. Правильно, мне не нужно уточнять дату. Я действительно ценю ваши ответы.