У меня есть несколько таблиц, в которых я храню данные, и в зависимости от типа человека (рабочий, гражданский), который выполнил задание, я хочу сохранить его в event
таблице, теперь эти ребята спасают животное (есть animal
таблица).
Наконец, я хочу иметь таблицу для хранения события, когда парень (рабочий, гражданский) спас животное, но поклон, должен ли я добавить внешний ключ или как узнать id
значение гражданского или рабочего, который выполнил работу?
Теперь, в этом проекте я не знаю, как определить, какой человек выполнял работу, если бы у меня был только какой-то человек (он же гражданский), я бы только civil_id
сохранял вейл в person
столбце в этой последней таблице ... но как знаю, если это был гражданский или рабочий, мне нужны другие "промежуточные" таблицы?
Как отразить дизайн следующей диаграммы в MySQL?
Дополнительные детали
Я смоделировал это следующим образом:
DROP TABLE IF EXISTS `tbl_animal`;
CREATE TABLE `tbl_animal` (
id_animal INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(25) NOT NULL DEFAULT "no name",
specie VARCHAR(10) NOT NULL DEFAULT "Other",
sex CHAR(1) NOT NULL DEFAULT "M",
size VARCHAR(10) NOT NULL DEFAULT "Mini",
edad VARCHAR(10) NOT NULL DEFAULT "Lact",
pelo VARCHAR(5 ) NOT NULL DEFAULT "short",
color VARCHAR(25) NOT NULL DEFAULT "not defined",
ra VARCHAR(25) NOT NULL DEFAULT "not defined",
CONSTRAINT `uc_Info_Animal` UNIQUE (`id_animal`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tbl_animal` VALUES (1,'no name', 'dog', 'M','Mini','Lact','Long','black','Bobtail');
INSERT INTO `tbl_animal` VALUES (2,'peluchin', 'cat', 'M','Mini','Lact','Long','white','not defined');
INSERT INTO `tbl_animal` VALUES (3,'asechin', 'cat', 'M','Mini','Lact','Corto','orange','not defined');
DROP TABLE IF EXISTS `tbl_person`;
CREATE TABLE `tbl_person` (
type_person VARCHAR(50) NOT NULL primary key
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tbl_person` (type_person) VALUES ('Worker');
INSERT INTO `tbl_person` (type_person) VALUES ('Civil');
DROP TABLE IF EXISTS `tbl_worker`;
CREATE TABLE `tbl_worker`(
id_worker INTEGER NOT NULL PRIMARY KEY,
type_person VARCHAR(50) NOT NULL ,
name_worker VARCHAR(50) NOT NULL ,
address_worker VARCHAR(40) NOT NULL DEFAULT "not defined",
delegation VARCHAR(40) NOT NULL DEFAULT "not defined",
FOREIGN KEY (type_person) REFERENCES `tbl_person` (type_person),
CONSTRAINT `uc_Info_worker` UNIQUE (`id_worker`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tbl_worker` VALUES (1,'Worker','N_CEDENTE1', 'DIR Worker 1', 'DEL');
INSERT INTO `tbl_worker` VALUES (2,'Worker','N_worker1', 'DIR Worker 2', 'DEL');
INSERT INTO `tbl_worker` VALUES (3,'Worker','N_worker2', 'address worker','delegation worker');
DROP TABLE IF EXISTS `tbl_civil`;
CREATE TABLE `tbl_civil`(
id_civil INTEGER NOT NULL PRIMARY KEY,
type_person VARCHAR(50) NOT NULL ,
name_civil VARCHAR(50) ,
procedence_civil VARCHAR(40) NOT NULL DEFAULT "Socorrism",
FOREIGN KEY (type_person) REFERENCES `tbl_person` (type_person),
CONSTRAINT `uc_Info_civil` UNIQUE (`id_civil`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tbl_civil` VALUES (1,'Civil','N_civil1' , 'Socorrism');
CREATE TABLE `tbl_event` (
id_event INTEGER NOT NULL,
id_animal INTEGER NOT NULL,
type_person VARCHAR(50) NOT NULL ,
date_reception DATE DEFAULT '2000-01-01 01:01:01',
FOREIGN KEY (id_animal) REFERENCES `tbl_animal` (id_animal),
FOREIGN KEY (type_person ) REFERENCES `tbl_person` (type_person ),
CONSTRAINT `uc_Info_ficha_primer_ingreso` UNIQUE (`id_animal`,`id_event`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tbl_event` VALUES (1,1, 'Worker','2013-01-01 01:01:01' );
INSERT INTO `tbl_event` VALUES (2,2, 'Civil','2013-01-01 01:01:01' );
Однако есть ли способ избавиться от нуля?
У меня есть следующие вопросы:
SELECT a.*,b.*,z.*
FROM tbl_event a
left JOIN tbl_worker b
ON a.type_person = b.type_person
left JOIN tbl_animal z
ON z.id_animal = a.id_animal ;
SELECT a.*,b.*,z.*
FROM tbl_event a
left JOIN tbl_civil b
ON a.type_person = b.type_person
left JOIN tbl_animal z
ON z.id_animal = a.id_animal ;
Вот обновленный sqlfiddle .
источник
TYPE_PERSON
когда она содержит только один столбец?Ответы:
Поскольку я сделал диаграмму, я лучше отвечу;)
К сожалению, современные реляционные базы данных не поддерживают наследование напрямую, поэтому вам необходимо преобразовать его в «простые» таблицы. Обычно для этого есть 3 стратегии:
Для получения дополнительной информации о том, что это на самом деле означает, а также о некоторых плюсах и минусах, см. Ссылки, приведенные в моем исходном сообщении , но в двух словах (3), вероятно, должно быть вашим значением по умолчанию, если у вас нет конкретной причины для одного из двух других. Вы можете представить (3) в базе данных просто так:
К сожалению, эта структура позволит вам иметь ,
person
что не является ниcivil
ниworker
(т.е. вы можете создать экземпляр абстрактного класса), а также позволит вам создатьperson
это какcivil
иworker
. Существуют способы применения первого на уровне базы данных, и в СУБД, которая поддерживает отложенные ограничения 3, даже последние могут быть применены в базе данных, но это один из немногих случаев, когда использование целостности на уровне приложения может оказаться предпочтительным. ,1
person
,civil
иworker
в этом случае.2
civil
иworker
в этом случае (person
является «абстрактным»).3 Что MySQL не делает.
источник
civil
и другимworker
)civil
и вworker
. Возможно, вы пропустили сокращенный синтаксис (толькоREFERENCES
безFOREIGN KEY
)?Нет необходимости в различном Civil_ID и Worker_ID; просто продолжайте использовать Person-ID в качестве ключа для всех трех таблиц: Person, Civil и Worker. Добавьте столбец PersonType к Person с двумя значениями "Civil" и "Worker".
Теперь он представляет два подкласса CivilClass и WorkerClass абстрактного базового класса PersonClass в качестве дочерних объектов Civil и Worker базового объекта Person. Вы получаете хорошее соответствие между моделью данных в БД и объектной моделью в приложении.
источник
civil_id
иworker_id
- это то же самое, чтоperson_id
и просто названные по-разному - посмотрите наFK1
маркер (внешний ключ) перед ними.Ваш случай является примером моделирования класса / подкласса. Или, как вы наметили это в ER, обобщение / специализация.
Есть три метода, которые помогут вам разработать таблицы mysql для решения этой проблемы. Они называются наследованием отдельных таблиц, наследованием таблиц классов и общим первичным ключом. Вы можете прочитать о них на информационной вкладке из соответствующего тега в SO.
/programming//tags/single-table-inheritance/info
/programming//tags/class-table-inheritance/info
/programming//tags/shared-primary-key/info
Наследование отдельных таблиц полезно для простых случаев, когда наличие NULL не вызывает проблем. Наследование таблиц классов лучше для более сложных случаев. Общий первичный ключ - это хороший способ реализации отношений один-к-одному и ускорения соединений.
источник
Вы можете создать таблицу типов лиц и добавить поле ко всем таблицам, нуждающимся в применении типа. Затем создайте внешние ключи. Вот пример, полученный из вашего ...
источник