powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Можно ли связать две таблицы 1 к 1 в обе стороны?
25 сообщений из 39, страница 1 из 2
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040686
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица категории и таблица подкатегории, идентифицирующая связь один к одному.
Категория имеет внешний ключ в одну сторону (типа CASCADE),
подкатегория - внешний ключ в другую сторону (тоже CASCADE).
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLE `cargo_card` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `contract_cargo_sub_id` int(11) unsigned NOT NULL,
  `object_type` enum('auto',' wagon',' vessel',' placement') NOT NULL,
  PRIMARY KEY (`id`),
  KEY `contract_cargo_sub_id` (`contract_cargo_sub_id`),
  CONSTRAINT `cargo_card_fk1` FOREIGN KEY (`contract_cargo_sub_id`) REFERENCES `contract_cargo_sub` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=0;

CREATE TABLE `auto_cargo_card` (
  `id` int(11) unsigned NOT NULL,
  `auto_card_id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `auto_card_id` (`auto_card_id`),
  CONSTRAINT `auto_cargo_card_fk2` FOREIGN KEY (`id`) REFERENCES `cargo_card` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `auto_cargo_card_fk1` FOREIGN KEY (`auto_card_id`) REFERENCES `auto_card` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=0;


Если удаляем категорию, каскадно удаляется подкатегория.
Если удаляем внешний родительскую запись категории, удаляется каскадно категория и подкатегория. Тут все нормально.
Проблема в том, что если удалить запись auto_card, то подкатегория тоже удалится каскадно, а категория не удалится. Но категория без подкатегории не имеет смысла. Надо чтобы тоже удалялась.
Можно ли сделать колцевую зависимость в обе стороны? В нижней таблице внешний ключ на верхнюю, в верхней - внешний ключ на нижнюю?


Если удаляется запись по внешнему ключу категории, то удаляется
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040690
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь тоже каскадный ключ.
Код: sql
1.
CONSTRAINT `auto_cargo_card_fk1` FOREIGN KEY (`auto_card_id`) REFERENCES `auto_card` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040698
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтоб проще понять: можно ли сделать вот так?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE `cargo_card` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `contract_cargo_sub_id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `cargo_card_fk2` FOREIGN KEY (`id`) REFERENCES `auto_cargo_card` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=0;

CREATE TABLE `auto_cargo_card` (
  `id` int(11) unsigned NOT NULL,
  `auto_card_id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `auto_cargo_card_fk2` FOREIGN KEY (`id`) REFERENCES `cargo_card` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=0;
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040700
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или еще проще, чтоб понятно было:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE `cargo_card` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
  CONSTRAINT `cargo_card_fk2` FOREIGN KEY (`id`) REFERENCES `auto_cargo_card` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=0;

CREATE TABLE `auto_cargo_card` (
  `id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `auto_cargo_card_fk2` FOREIGN KEY (`id`) REFERENCES `cargo_card` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=0;
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040703
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladНо категория без подкатегории не имеет смысла.Это почему это?
Не знаю, что у вас за предметная область, но обычно в категории может быть несколько категорий, включая ноль.

И если так, то зачем две таблицы? Почему не объединить в одну?
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040712
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

есть карточка груза, который может быть связан с автомобилем и с вагоном. если удаляется автомобиль, в котром лежал груз, то нет смысла и в этой карточке груза. так же и с вагоном. А верхняя таблица содержит общие поля, и на нее может быть в других таблицах одна ссылка, а не разные (№ вагона, № авто).
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040720
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladесли удаляется автомобиль, в котром лежал грузЯ спрашивал про обратное направление. Если удалили груз, то зачем удалять весь автомобиль?
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040725
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

в общем вот:
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040733
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftsvnvladесли удаляется автомобиль, в котром лежал грузЯ спрашивал про обратное направление. Если удалили груз, то зачем удалять весь автомобиль?
вы не понимаете, автомобиль никто не удаляет. автомобиля на схеме не видно, так же как и сам груз.
вот этот кортеж card_cargo - auto_card_cargo связывает груз и автомобиль. груз это по ссылке contract_cargo_sub_id, автомобиль по ссылке auto_card_id.
Если удаляется груз, то обе вот эти таблицы должны удалиться, а если удаляется автомобиль, то тоже обе этих должны удалиться, потому что это как бы одна таблица.
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040738
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cargo_card и auto_cargo_card имеют общий id.
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040740
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автомобили находятся справа от правой таблицы, грузы - сверху от левой таблицы.
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040744
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чтобы обращаться одинаково и к карточкам груза автомобиля, и к карточкам груза вагона, была сделана объединяющая их категория. теперь понятно?
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040745
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladвы не понимаетеНе понимаю, поэтому и задаю дурацкие вопросы. Имхо, правильно спроектировать таблицы можно только зная предметную область и поставленную задачу.

svnvladавтомобиля на схеме не видно, так же как и сам груз.Т.е. "карточка груза" - это не груз? Логично, да...

svnvladЕсли удаляется груз, то обе вот эти таблицы должны удалиться, а если удаляется автомобиль, то тоже обе этих должны удалиться, потому что это как бы одна таблица.Тогда повторю вопрос - зачем две таблицы? Почему не объединить в одну?
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040751
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladчтобы обращаться одинаково и к карточкам груза автомобиля, и к карточкам груза вагона, была сделана объединяющая их категория. теперь понятно?А зачем разделены таблицы автомобилей и вагонов?
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040752
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftТогда повторю вопрос - зачем две таблицы? Почему не объединить в одну?
Потому что есть еще карточка вагона. А надо обращаться и к карточке автомобиля, и к карточке вагона одним способом, по одному полю.
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040756
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы не знакомы, что такое идентифицирующее отношение, категоризация.
Это не про "группа товара" и "товар".
А про Человек - женщина, человек - мужчина.
У женщины есть поле "Размер матки", у мужчины - "Размер простаты" ))
А обращаться к ним хочется по одному полю Id_человека.
так вот если вы удалите запись из поля мужчина, то запись в поле человек тоже надо удалять.
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040758
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из таблицы вернее.
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040762
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladЭто не про "группа товара" и "товар".
А про Человек - женщина, человек - мужчина.
У женщины есть поле "Размер матки", у мужчины - "Размер простаты" ))
А обращаться к ним хочется по одному полю Id_человека.
так вот если вы удалите запись из поля мужчина, то запись в поле человек тоже надо удалять.Это не мешает сделать одну таблицу и заполнять только те поля, которые нужны/возможны для данного типа человека.
В других СУБД можно даже констрейнт соответствующий наложить. В MySQL можно сделать аналог такого констрейнта триггером.
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040765
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladmiksoftТогда повторю вопрос - зачем две таблицы? Почему не объединить в одну?
Потому что есть еще карточка вагона. А надо обращаться и к карточке автомобиля, и к карточке вагона одним способом, по одному полю.А когда появятся самолеты и воздушные шары, будете еще таблицы создавать?
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040768
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
svnvladавтомобиля на схеме не видно, так же как и сам груз.Т.е. "карточка груза" - это не груз? Логично, да...

Карточка груза - это маленькая партия (большого конкретного груза) в данном транспортном средстве.
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040778
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftsvnvladпропущено...

Потому что есть еще карточка вагона. А надо обращаться и к карточке автомобиля, и к карточке вагона одним способом, по одному полю.А когда появятся самолеты и воздушные шары, будете еще таблицы создавать?
А вы предлагаете сделать так?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE `cargo_card` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `contract_cargo_sub_id` int(11) unsigned NOT NULL,
  `auto_card_id: integer,
  `wagon_card_id: integer,
  `самолет_id: integer`,
  `воздушный_шар_id: integer,
  `пароход_id: integer,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=0;


При том, что ненулевое значение будет только в одном из полей?
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040790
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или еще веселей:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE `человек` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `ФИО,
  `№ карты пациента`, // Иванов Иннокентий Петрович
  `размер матки`,
  `сколько раз рожала`,
  .............
  ........
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=0;
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040796
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladmiksoftпропущено...
Т.е. "карточка груза" - это не груз? Логично, да...

Карточка груза - это маленькая партия (большого конкретного груза) в данном транспортном средстве.Если это партия, неделимая в процессе транспортировки, то у нас это называется "тарное место".
Физически это обычно либо палетта, либо небольшой контейнер.
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040803
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladmiksoftпропущено...
А когда появятся самолеты и воздушные шары, будете еще таблицы создавать?
А вы предлагаете сделать так?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE `cargo_card` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `contract_cargo_sub_id` int(11) unsigned NOT NULL,
  `auto_card_id: integer,
  `wagon_card_id: integer,
  `самолет_id: integer`,
  `воздушный_шар_id: integer,
  `пароход_id: integer,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=0;



При том, что ненулевое значение будет только в одном из полей?Нет, вот так:
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE `cargo_card` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `contract_cargo_sub_id` int(11) unsigned NOT NULL,
  `траспортное_средство_card_id: integer,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=0;

Кстати, необходимость поля id тут тоже под вопросом.
...
Рейтинг: 0 / 0
Можно ли связать две таблицы 1 к 1 в обе стороны?
    #39040805
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladИли еще веселей:Список полов человека, кстати, тоже непостоянен. В зависимости от предметной области, насколько я в курсе, их может быть от 2 до 6.
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Можно ли связать две таблицы 1 к 1 в обе стороны?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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