@TheRuby

Каким образом сохранить целостность данных в базе без триггеров?

Каким образом сохранить целостность данных в базе без триггеров?
Предположим, у нас есть счета, которые выставляются разным клиентам и услуги, предоставляемые разным клиентам. Хотелось бы на уровне индексов запретить выставление счетов на те услуги, которые данной компании не предоставлялись.
Схема базы:
CREATE TABLE `customers` (
	`id` INT(10) NOT NULL,
	`name` varchar(20) NOT NULL,
	PRIMARY KEY (`id`)
);

CREATE TABLE `bills` (
	`id` INT(10) NOT NULL,
	`number` varchar(6) NOT NULL,
	`customer` INT(10) NOT NULL,
	`creation_date` DATE NOT NULL,
	PRIMARY KEY (`id`)
);

CREATE TABLE `services` (
	`id` INT(10) NOT NULL,
	`service_name` varchar(50) NOT NULL,
	`customer` INT(10) NOT NULL,
	PRIMARY KEY (`id`)
);

CREATE TABLE `Untitled` (
	`id` INT NOT NULL,
	`bill` INT NOT NULL,
	`service` INT NOT NULL,
	PRIMARY KEY (`id`)
);

ALTER TABLE `bills` ADD CONSTRAINT `bills_fk0` FOREIGN KEY (`customer`) REFERENCES `customers`(`id`);

ALTER TABLE `services` ADD CONSTRAINT `services_fk0` FOREIGN KEY (`customer`) REFERENCES `customers`(`id`);

ALTER TABLE `Untitled` ADD CONSTRAINT `Untitled_fk0` FOREIGN KEY (`bill`) REFERENCES `bills`(`id`);

ALTER TABLE `Untitled` ADD CONSTRAINT `Untitled_fk1` FOREIGN KEY (`service`) REFERENCES `services`(`id`);


То есть, каким образом запретить в таблице `bills` возможность вставлять данные об услугах, оказанных для других компаний?

Заранее спасибо.
  • Вопрос задан
  • 552 просмотра
Решения вопроса 1
@Azperin
Дилетант
Клиент заказывает перевозку, например через сайт, на языке программирования проверяется что выбрана хотябы одна услуга и потом создается счет и к счету привязываем заказ.
START TRANSACTION;
INSERT INTO `bills`(`custom_id`) VALUES ($ид_клиента);


$bill_id = mysqli_последний_вставленный_ид

И добавляем какие услуги нужно предоставить. Проверку выполнена она или нет, сами сделаете.
foreach ($массив с ИД зказанных услуг) {
INSERT INTO `order_service`(`bill_id`,`service_id`) VALUES ($bill_id,$service_id);
};
COMMIT;


Тоесть получаем 1 счет на 1 клиента и хоть ты убей не получится в счет вписать еще 1 клиента. Все услуги будут привязанны именно к этому счету.

После выполнения собираем все выполненные заказанные услуги и выставляем клиенту:
SELECT `service_id` 
FROM `order_service`  
WHERE `bill_id`=$по счету


Названия и прочее добивать джойнами.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dmitryKovalskiy
программист средней руки
Вариант написать хранимую процедуру с транзакцией добавления данных с нужными проверками не рассматриваете?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы