powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Первичный и альтернативный ключи и связь таблиц
16 сообщений из 16, страница 1 из 1
Первичный и альтернативный ключи и связь таблиц
    #39238263
Алексей SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемы гуру SQL! Прошу помочь правильно определится с ключами и связью таблиц.
ER-диаграмму приложил. Преподаватель говорит что делаю неправильно, надеюсь на вашу помощь.

Сделал такой скрипт:

CREATE TABLE payment_type (
payment_type_id INTEGER
NOT NULL PRIMARY KEY,
name VARCHAR(15),
price_area NUMERIC(7,2),
price_people NUMERIC(7,2)

);

CREATE TABLE apartment (
apartment_id INTEGER
NOT NULL PRIMARY KEY,
apartment_number SMALLINT,
house_number SMALLINT,
number_people SMALLINT,
area SMALLINT

);

CREATE TABLE payment (
payment_type_id INTEGER not Null
REFERENCES payment_type(payment_type_id)
ON DELETE RESTRICT ON UPDATE RESTRICT,
apartment_id INTEGER NOT NULL
REFERENCES apartment(apartment_id)
ON DELETE RESTRICT ON UPDATE RESTRICT,
m_y_date DATE,
summ NUMERIC(7,2),
payment_date DATE
);
...
Рейтинг: 0 / 0
Первичный и альтернативный ключи и связь таблиц
    #39238272
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей SQL,

На основании чего вы всё это делаете, есть ТЗ? И что первично -- скрипт или ER?

А так — скрипт использует английские названия, а схема -- русские. Конечно оно неправильно...
...
Рейтинг: 0 / 0
Первичный и альтернативный ключи и связь таблиц
    #39238277
Алексей SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,первично ER, по ней нужно создать таблицы.
...
Рейтинг: 0 / 0
Первичный и альтернативный ключи и связь таблиц
    #39238333
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей SQLПрошу помочь правильно определится с ключами и связью таблиц.
ER-диаграмму приложил. Преподаватель говорит что делаю неправильно, надеюсь на вашу помощь.Навскидку. В таблице payment отсутствует PRIMARY KEY. В остальных UNIQUE - естественных альтернативных ключей, чтобы бы не было дублирующих видов оплаты или квартир в соответствующих таблицах. Тема, скорее, для форума Проектирование БД .
...
Рейтинг: 0 / 0
Первичный и альтернативный ключи и связь таблиц
    #39238334
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей SQL,

Первичный ключ должен быть в каждой таблице.
...
Рейтинг: 0 / 0
Первичный и альтернативный ключи и связь таблиц
    #39238336
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей SQL,

в payment не хватает какого-нибудь primary key, хранить месяц/год в поле типа date может быть не совсем корректно. в остальном на вид ок.
...
Рейтинг: 0 / 0
Первичный и альтернативный ключи и связь таблиц
    #39238395
Алексей SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое за ответы, буду пробовать!
...
Рейтинг: 0 / 0
Первичный и альтернативный ключи и связь таблиц
    #39238397
Алексей SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще небольшой вопрос. Я правильно сделал связи
payment_type_id INTEGER not Null
REFERENCES payment_type(payment_type_id)
ON DELETE RESTRICT ON UPDATE RESTRICT,

или они не нужны?
...
Рейтинг: 0 / 0
Первичный и альтернативный ключи и связь таблиц
    #39238456
Алексей SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переделал, посмотрите что получилось. Немного сомневаюсь в ключах
CREATE TABLE payment_type (
payment_type_id INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(15) UNIQUE,
price_area NUMERIC(7,2),
price_people NUMERIC(7,2)

);

CREATE TABLE apartment (
apartment_id INTEGER NOT NULL PRIMARY KEY,
apartment_number SMALLINT,
house_number SMALLINT,
number_people SMALLINT,
area SMALLINT,
UNIQUE (apartment_number, house_number)
);

CREATE TABLE payment (
payment_id INTEGER NOT NULL PRIMARY KEY,
payment_type_id INTEGER NOT NULL REFERENCES payment_type(payment_type_id) ON DELETE RESTRICT ON UPDATE RESTRICT,
apartment_id INTEGER NOT NULL REFERENCES apartment(apartment_id) ON DELETE RESTRICT ON UPDATE RESTRICT,
m_y_date DATE,
summ NUMERIC(7,2),
payment_date DATE
);
...
Рейтинг: 0 / 0
Первичный и альтернативный ключи и связь таблиц
    #39238503
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей SQL,

Провеки целостности лучше оставить как есть (NO ACTION). Эффект такой же, как и у RESTRICT, однако NO ACTION может быть отложена до конца транзакции.

В таблице payment только суррогатный первичный ключ и нет уникального по реальным значениям.
Для уникального понадобиться изменить формат хранения m_y_date.
...
Рейтинг: 0 / 0
Первичный и альтернативный ключи и связь таблиц
    #39238534
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorovВ таблице payment только суррогатный первичный ключ и нет уникального по реальным значениям.

Если есть уникальный ключ, зачем тогда нужен суррогатный. В данной схеме можно обойтись натуральными ключами.
...
Рейтинг: 0 / 0
Первичный и альтернативный ключи и связь таблиц
    #39238547
Алексей SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
big-trot,

подскажите пожалуйста как это сделать, какие поля взять за ключи?
...
Рейтинг: 0 / 0
Первичный и альтернативный ключи и связь таблиц
    #39238632
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trotЕсли есть уникальный ключ, зачем тогда нужен суррогатный. В данной схеме можно обойтись натуральными ключами.
Это понятно. Я же и говорил о том, что натуральных ключей нет.
...
Рейтинг: 0 / 0
Первичный и альтернативный ключи и связь таблиц
    #39238697
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей SQLПеределал, посмотрите что получилось. Немного сомневаюсь в ключахавторCREATE TABLE payment (
payment_id INTEGER NOT NULL PRIMARY KEY,
payment_type_id INTEGER NOT NULL REFERENCES payment_type(payment_type_id) ON DELETE RESTRICT ON UPDATE RESTRICT,
apartment_id INTEGER NOT NULL REFERENCES apartment(apartment_id) ON DELETE RESTRICT ON UPDATE RESTRICT,
m_y_date DATE,
summ NUMERIC(7,2),
payment_date DATE,
PRIMARY KEY(apartment_id, payment_type_id, m_y_date)
);
Если правильно понял исходную модель, то так, IMHO, будет разумнее. По смыслу означает, что для одной и той же квартиры один и тот же вид оплаты за один месяц года может быть выполнен только один раз. Порядок полей в PRIMARY KEY должен быть выбран под наиболее частый вид условий при выполнении запросов. Впрочем, в логической задачке это неважно, важнее правильные ограничения.
...
Рейтинг: 0 / 0
Первичный и альтернативный ключи и связь таблиц
    #39238737
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChAПо смыслу означает, что для одной и той же квартиры один и тот же вид оплаты за один месяц года может быть выполнен только один раз. т.е. частичные платежи в практике не имеют место быть?
...
Рейтинг: 0 / 0
Первичный и альтернативный ключи и связь таблиц
    #39238754
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LonepsychoChAПо смыслу означает, что для одной и той же квартиры один и тот же вид оплаты за один месяц года может быть выполнен только один раз. т.е. частичные платежи в практике не имеют место быть?
Представленная ER позволяет думать, что в рамках поставленной задачи частичных платежей не будет.

В противном случае там было бы больше сущностей: счёт для квартиры (с баланасом), выставленные счета, платежи.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Первичный и альтернативный ключи и связь таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]