Структура таблиц и необязательные данные

anpv

Guest
Структура таблиц и необязательные данные

Доброго времени суток.
Подскажите, правильна ли такая структура таблиц (с точки зрения нормализации данных).
Имеется таблица с информацией о покупателе, со следующими данными: фамилия, имя, отчество, паспорт, дата рождения и т.д. Из этих данных обязательными является только фамилия.
Тогда получается следующая структура таблиц:
PHP:
CREATE TABLE `customer` (
`id` int not null auto_increment,
`last_name` varchar(20) not null,
PRIMARY KEY(`id`));
-------------
CREATE TABLE `cust_fname` (
`id` int not null auto_increment,
`id_customer` int not null,
`first_name` varchar(15) not null,
PRIMARY KEY (`id`,`id_customer`));
-------------
CREATE TABLE `cust_pname` (
`id` int not null auto_increment,
`id_customer` int not null,
`patronymic_name` varchar(20) not null,
PRIMARY KEY (`id`,`id_customer`));
-------------
CREATE TABLE `cust_passport` (
`id` int not null auto_increment,
`id_customer` int not null,
`s_pass` varchar(4) not null,
`n_pass` varchar(6) not null,
PRIMARY KEY (`id`,`id_customer`));
...
Получение информации одним запросом, с учетом того, что имени, отчества, паспортных данных может не быть:
PHP:
SELECT 
`customer`.`last_name`,  `cust_fname`.`first_name`,  `cust_pname`.`patronymic_name`, `cust_passport`.`s_pass`, `cust_passport`.`n_pass` 
FROM 
`customer`
LEFT JOIN `cust_fname` ON `cust_fname`.`id_customer`=`customer`.`id`
LEFT JOIN `cust_pname` ON `cust_pname`.`id_customer`=`customer`.`id`
LEFT JOIN `cust_passport` ON `cust_passport`.`id_customer`=`customer`.`id`
 

anpv

Guest
neko
Почему неправильная?
Если все будет в одной таблице то в 70% случаев кроме фамилии не будет никаких данных (остальные поля будут пустыми)
 

neko

tеam neko
ничего страшного
join при отсутствии мега-планировщика довольно тяжелая операция
а так у тебя просто будет чуть больше места расходоваться

-~{}~ 16.08.04 09:09:

вот например если бы у тебя был адрес или телефон, их бы имело смысл вынести
 

anpv

Guest
А как тогда быть с адресами и телефонами.
Т.е. у покупателя адресов и телефонов может быть [0 .. n].
Для решения этой проблемы я вижу 2 варианта:
1) Если в таблице `customer` добавить ключевые поля `id_adress` и `id_phone` ссылающиеся на поле `id` из таблиц `adress` и `phone`, то тогда одним запросом не добыть всю информацию о покупателе у которого не введен адрес или телефон (поля `id_adress` и `id_phone` будут неопределенными).
2) Другим вариантом может быть добавление в таблицы `adress` и `phone` поля `id_customer` содержащего id покупателя.
Какой вариант будет правильным?
 

ForJest

- свежая кровь
Кстати нормализация не даёт однозначного ответа на этот вопрос, насколько я понимаю.
Поэтому, если в сущности у тебя по какому-нибудь атрибуту допускается пустое значение (не NULL) то ты вполне вправе его запихать в таблицу.
 
Сверху