#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. Правильно, мне не нужно уточнять дату. Я действительно ценю ваши ответы.