Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Ограничение по DNKF / 10 сообщений из 10, страница 1 из 1
06.07.2009, 10:30
    #36074465
detail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение по DNKF
Теоретическая задача: есть таблица "человек":
ID*
Имя
Фамилия
Отчество
Дата рождения
Пол

Таблица "брак":
ID мужа*
ID жены*

* ключ, в таблице "брак" каждая колонка - ключ, чтобы не было двоежёнства (страны с многожёнством не рассматриваем).

Как можно, соблюдая какие нормальные формы (DKNF), ввести ограничения, чтобы в ID мужа был записан только мужчина, а в ID жены - только женщина?

Мне пока приходят в голову только сделать 2 вьюшки: мужчины, женщины. Это подходит под определение DKNF?
...
Рейтинг: 0 / 0
06.07.2009, 10:49
    #36074509
Kirill Razuvaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение по DNKF
Такую проверку можно либо в constraint оформить, либо просто в триггере
проверять.
P.S. В некоторых странах разрешены однополые браки, поэтому деление на мужей
и жен может оказаться проблемным...

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
06.07.2009, 10:58
    #36074546
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение по DNKF
detail wrote:

> Как можно, соблюдая какие нормальные формы (DKNF), ввести ограничения,
> чтобы в ID мужа был записан только мужчина, а в ID жены - только женщина?

Никак, тебе придётся разбить таблицу людей на две, одну с мужчинами, другую с
женщинами, и сделать два констрейнта FK на одну и другую таблицу.
Но в свете последних веяний в деле брака (которые мне лично вовсе
не нравятся) это будет в корне неправильный дизайн БД, потому что браки
заключаются не только между М-Ж, но и в других вариациях. К тому же браки
могут быть между более чем 2-мя людьми, даже в нашей стране, причём это --
наоборот, традиционные браки. Так что мой совет - плюнуть на ограничения
декларативные, и реализовать их программно, в виде триггеров или процедур.

> Мне пока приходят в голову только сделать 2 вьюшки: мужчины, женщины.
> Это подходит под определение DKNF?

Нормальные формы вьюхами не оперируют. И как бы ты проверку-то сделал бы ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
06.07.2009, 11:26
    #36074629
detail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение по DNKF
ОК, спасибо. Это не для реальной БД, просто упражнение, поэтому однополые браки исключаем. Когда написал, скоро понял, что на вьюхи не действуют ограничения внешних ключей :)
...
Рейтинг: 0 / 0
06.07.2009, 17:11
    #36075757
ChA
ChA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение по DNKF
detailКак можно, соблюдая какие нормальные формы (DKNF), ввести ограничения, чтобы в ID мужа был записан только мужчина, а в ID жены - только женщина?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE "Человек" (
	ID int PRIMARY KEY
	, "Имя" varchar( 30 )
	, "Фамилия" varchar( 30 )
	, "Отчество" varchar( 30 )
	, "Дата рождения" datetime
	, "Пол" char( 1 ) CHECK("Пол" IN ('М', 'Ж'))
	, UNIQUE (ID, "Пол")
)

CREATE TABLE "Брак" (
	"ID мужа" int
	, "Пол мужа" char( 1 ) CHECK("Пол мужа" = 'М')
	, "ID жены" int
	, "Пол жены" char( 1 ) CHECK("Пол жены" = 'Ж')
	,  FOREIGN KEY ("ID мужа", "Пол мужа") REFERENCES "Человек" ("ID", "Пол")
	,  FOREIGN KEY ("ID жены", "Пол жены") REFERENCES "Человек" ("ID", "Пол")
)
?
...
Рейтинг: 0 / 0
07.07.2009, 11:18
    #36076924
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение по DNKF
ChA wrote:

> , "Пол" char(*1*) CHECK("Пол" IN ('М', 'Ж'))

Вспомнил старую байку ещё из фидошной конфы по проектированию БД.
Обсуждали тему, как нужно делать поля в разных случаях: через
домены (т.е. ограничения возможных значений списками значений) или
через словари (справочники). Когда что лучше и когда что допустимо.
Понятно, что если список значений может расширяться, то необходимо
вводить справочник. Но когда список значений строго фиксирован,
то можно делать домен, а можно -- справочник, хотя казалось бы
это не нужно вовсе -- значения --то фиксированы. Стали приводить
примеры таких значений. Очевидный пример -- пол человека. Но
тут же пришёл один товарищь, который разрабатывал системы для
медучереждений, и рассказал свою историю, как они сделали пол
через домен (т.е. так же, как и здесь, CHECK("Пол" IN ('М', 'Ж')) ).
Но поимели кучу проблем, когда стали внедрять своё ПО в кожно-венерологическом
диспансере: "Там этих полов -- штук 10 !" -- говорит.
"Мужской гетеросексуальный, мужской гомосексуальный, мужской бисексуальный,
женский гетеросексуальный и т.д." С тех пор они в комманде не используют
домены вообще.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
07.07.2009, 15:08
    #36077610
Cane Cat Fisher
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение по DNKF
MasterZiv,

Они (диспансер) просто нарушили 1НФ: смешали в один два атрибута - пол и сексуальную ориентацию. А домены тут не при чем.
...
Рейтинг: 0 / 0
07.07.2009, 17:23
    #36078249
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение по DNKF
Cane Cat Fisher пишет:

> Они (диспансер) просто нарушили 1НФ: смешали в один два атрибута - пол и
> сексуальную ориентацию. А домены тут не при чем.

Вообще говоря, утверждать это можно с уверенностью только зная досконально
предметную область. Мы её не знаем.
Но даже если убрать оттуда ориентацию, полов можно придумать больше, чем 2.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
07.07.2009, 19:14
    #36078499
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение по DNKF
MasterZivНо даже если убрать оттуда ориентацию, полов можно придумать больше, чем 2.
Участвовал я в разработке системы, где было три пола: мужчина, женщина и ребёнок.
...
Рейтинг: 0 / 0
07.07.2009, 19:25
    #36078508
Сахават Юсифов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение по DNKF
ChA,

Потуги все это. Простейший жизненный вопрос вводит в ступор РМД.
А так ведь все просто -
Мужик
Баба
Человек {Мужик; Баба} ---- во где ступор (Это агрегатный тип - виртуальный)
Семья(Муж->Мужик, Жена->Баба)
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Ограничение по DNKF / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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