powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Внешний ключ (и все-таки, как правильно) ?
25 сообщений из 34, страница 1 из 2
Внешний ключ (и все-таки, как правильно) ?
    #38832191
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,
Есть таблица ДокументыДвиженияОборудования, которая ссылается на ТипыДокументов (порт -> вышка, вышка -> поставщик, судно -> судно, вышка -> вышка, и т.д). Соответсвенно, в зависимости от типа source & destination у документов разные, при чем это не только разные адреса (freetext), а ссылки на конкретные объекты, у которых уже потом могут быть разные адреса (поставщик) или не быть адреса вообще (судно), и прочие другие аттрибуты.
Пока кроме как тупо делать в ДокументыДвиженияОборудования {..., VendorSourceId nullable, RigSourceId nullable, WellSourceId nullable, VessekSourceId nullable, VendorDestinationId nullable, RigDestinationId nullable, WellDestinationId nullable, VessekDestinationId nullable} ничего не придумывается. Хотя нет, придумалось это вынести в отдельную таблицу, но от того в каком месте бред - его менъше не становится. Кроме того, типов (соответсвенно соурсов и дестинейшинов) со временем может быть больше. Другая проблема - документ обязан иметь один и только один source / destination (как быть тут с not null и integrity)?

Заранее спасибо за советы.
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38832204
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если делать кучу разных полей, то с not null и integrity довольно просто, в старые времена это называлось arc constraint: check nvl2(source_1, 1, 0) + nvl2(source_2, 1, 0) + nvl2(source_3, 1, 0) + .... = 1.

Кучи полей можно избежать, если сделать у источников-приёмников сквозную нумерацию (то есть непересекающиеся id).
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38832222
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerсделать у источников-приёмников сквозную нумерациюНо тогда это будет просто список возможных объектов, не ясно на что ссылающихся... Да и EF станет несколько сложнее (или при чем тут вообще EF? :) )
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38832227
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheerful Calfsoftwarerсделать у источников-приёмников сквозную нумерациюНо тогда это будет просто список возможных объектов, не ясно на что ссылающихся...
На что ссылаются, будет видно из типа документа и контролироваться join-ом (вот для последнего и нужна сквозная нумерация, чтобы из-за ошибки не прилинковать не ту запись).
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38832324
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerконтролироваться join-ом
Это как?
Надеюся я не так понял...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT CASE 
            WHEN d.fk_mr_type_id = 1 THEN sr.rig_id
            WHEN d.fk_mr_type_id = 2 THEN sb.base_id
       END                        AS AbstractSenderId,
       CASE 
            WHEN d.fk_mr_type_id = 1 THEN rr.rig_id
            WHEN d.fk_mr_type_id = 2 THEN rb.base_id
       END                        AS AbstractReceiverId
FROM   dbo.MainTable              AS d
       INNER JOIN dbo.Rigs        AS rr
            ON  d.fk_receiver_rig_id = rr.rig_id
       INNER JOIN dbo.Bases       AS sb
            ON  d.fk_sender_base_id = sb.base_id
       LEFT OUTER JOIN dbo.Bases  AS rb
            ON  d.fk_receiver_base_id = sb.base_id
       LEFT OUTER JOIN dbo.Rigs   AS sr
            ON  d.fk_sender_rig_id = sr.rig_id

...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38832413
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheerful CalfДобрый день,
Есть таблица ДокументыДвиженияОборудования, которая ссылается на ТипыДокументов (порт -> вышка, вышка -> поставщик, судно -> судно, вышка -> вышка, и т.д). Соответсвенно, в зависимости от типа source & destination у документов разные, при чем это не только разные адреса (freetext), а ссылки на конкретные объекты, у которых уже потом могут быть разные адреса (поставщик) или не быть адреса вообще (судно), и прочие другие аттрибуты.
Пока кроме как тупо делать в ДокументыДвиженияОборудования {..., VendorSourceId nullable, RigSourceId nullable, WellSourceId nullable, VessekSourceId nullable, VendorDestinationId nullable, RigDestinationId nullable, WellDestinationId nullable, VessekDestinationId nullable} ничего не придумывается. Хотя нет, придумалось это вынести в отдельную таблицу, но от того в каком месте бред - его менъше не становится. Кроме того, типов (соответсвенно соурсов и дестинейшинов) со временем может быть больше. Другая проблема - документ обязан иметь один и только один source / destination (как быть тут с not null и integrity)?

Заранее спасибо за советы.
Пока, не видно той проблемы, о которой Вы написали. Она скрыта за семантической проблемой. Что такое "вышка" или "судно". И что такое "поставщик"?
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38832425
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пункты (подразделения, склады - используйте принятый термин):
1) Свои и чужие.
2) Статические и динамические.
Например, автопогрузчик - свое динамическое подразделение.
Не видно никакой проблемы перемещения материи между пунктами)
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38832483
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бредятина,

Вы предлагаете, вышки, судна, порты, терминалы - запихать в одну таблицу пункты (аля контрагенты) и использовать ключ (тип пункта) ?
Тогда уточню (сорри не упомянул сразу) - уже есть отдельные таблицы для каждого из типов пунктов (как для отдельных бизнесс объектов) и менять их крайне не рекомендовано...
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38832498
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheerful CalfЭто как?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table Ship(shid_id integer, ship_name varchar(100));
insert into Ship values (1, 'Летучий Голландец');

create table Warehouse(wh_id integer, wh_name varchar(100));
insert into Warehouse values (2, 'Бездна');

create table Movement(move_id integer, move_type integer source_id integer, dest_id integer, qnt integer);

-- Ищем перемещения с корабля на склад

select s.name, wh.name, m.qnt
from Movement m, Ship s, Warehouse w
where
  m.source_id = s.ship_id and
  m.dest_id = w.wh_id and
  m.move_type = MOVE_FROM_SHIP_TO_WAREHOUSE;
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38832504
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

-- Ищем перемещения с корабля на склад

А откуда мне знать, что не наоборот?
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38832507
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheerful CalfБредятина,

Вы предлагаете, вышки, судна, порты, терминалы - запихать в одну таблицу пункты (аля контрагенты) и использовать ключ (тип пункта) ?
Тогда уточню (сорри не упомянул сразу) - уже есть отдельные таблицы для каждого из типов пунктов (как для отдельных бизнесс объектов) и менять их крайне не рекомендовано...
Для меня это очевидно и без уточнения)) Более того, перемещением может заниматься, в частности, человек (умещается в кармане или не слишком тяжело). Очевидно же, что уже итак есть такой объект - Человек. Объект Пункт (назовем так) имеет:
1) группу вычисляемых характеристик (их значения определяются путем извлечения определенных характеристики по одной из возможных связей, например, Наименование может быть Петров Сергей Николаевич);
2) группу характеристик для "самодостаточного" экземпляра объекта (не имеющего ни одной связи) - при этом, значения вычисляемых характеристик, конечно, все равно вычисляются;
3) и каждый экземпляр может иметь связь с ОДНИМ экземпляром ОДНОГО из "базовых" объектов (а может и не иметь - для "самодостаточных").
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38832599
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheerful CalfА откуда мне знать, что не наоборот?
Ну так Вы сначала сформулируйте, что хотите найти.
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38832874
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

Как? Вот если есть связь - все понятно. А так пришел кто-то, хочет найти сендера - и как ему знать что в зависимости от некоего поля надо искать тоже самое в разных таблицах?
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38832876
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бредятина,

Да. И как хранить это все? Если Петров Сергей Николаевич (из сущности HumanResources) учавствовал в двух перемещениях, в качестве пунктов? Вписать его АйДи (Int=55) в пункт? Как потом узнать что это айди human resours'a, а не терминала за айди 55 из таблицы Bases?
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38832912
JeStone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheerful CalfБредятина,

Вы предлагаете, вышки, судна, порты, терминалы - запихать в одну таблицу пункты (аля контрагенты) и использовать ключ (тип пункта) ?
Тогда уточню (сорри не упомянул сразу) - уже есть отдельные таблицы для каждого из типов пунктов (как для отдельных бизнесс объектов) и менять их крайне не рекомендовано...
Бредятина дело говорит, вам нужно унифицировать объекты через обобщенную таблицу.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
CREATE TABLE `документы_движения` (
  `id` int(11) NOT NULL auto_increment,
  `id_doc_type` int(11) NOT NULL, -- типы документов
  `id_source_object` int(11) NOT NULL,
  `id_dest_object` int(11) NOT NULL
  -- какие-то общие для всех документов поля
  …
 PRIMARY KEY (`id`), 
 FOREIGN KEY (`id_source_object`) REFERENCES `пукнты`(id) ON DELETE NO ACTION ON UPDATE CASCADE,
 FOREIGN KEY (`id_dest_object`) REFERENCES `пукнты`(id) ON DELETE NO ACTION ON UPDATE CASCADE
 ) ENGINE=InnoDB, AUTO_INCREMENT=0;

-- связь один к одному по `id` с таблицей `документы_движения`
CREATE TABLE `документы_порт_вышка` (
  `id` int(11) NOT NULL,
  -- поля, характерные для такого типа документов
  …
 PRIMARY KEY (`id`),
 FOREIGN KEY (`id`) REFERENCES `документы_движения`(`id`) ON DELETE CASCADE ON UPDATE CASCADE
 ) ENGINE=InnoDB;

-- связь один к одному по `id` с таблицей `документы_движения`
CREATE TABLE `документы_вышка_поставщик` (
  `id` int(11) NOT NULL,
  -- поля, характерные для такого типа документов
  …
 PRIMARY KEY (`id`),
 FOREIGN KEY (`id`) REFERENCES `документы_движения`(`id`) ON DELETE CASCADE ON UPDATE CASCADE
 ) ENGINE=InnoDB;

-- и т.д.



Объекты тоже унифицировать по примеру выше. Общая таблица `пункты` и частные таблицы `судно`, `вышка` и т.д.
Что касается HumanResources, то один человек может участвовать в нескольких перемещениях и в одном перемещении может участвовать несколько человек. Тут напрашивается связь многие-ко-многим с таблицей `документы_движения`
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38832971
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheerful CalfБредятина,

Да. И как хранить это все? Если Петров Сергей Николаевич (из сущности HumanResources) учавствовал в двух перемещениях, в качестве пунктов? Вписать его АйДи (Int=55) в пункт? Как потом узнать что это айди human resours'a, а не терминала за айди 55 из таблицы Bases?
Вы только не обижайтесь, пожалуйста. То ли Вы не читаете сообщения, то ли не знакомы с основами БД(((
Документ: накладная на перемещение {Дата перемещения, ...}
Пункт {Наименование, ..., Наименование пункта, ...}
---
Документ: накладная на перемещение <-- Из/ Из которого (М:1) --- Пункт
Документ: накладная на перемещение <-- В/ В который (М:1) --- Пункт
Пункт --- Является/Является (1:1) --- Человек
Пункт --- Является/Является (1:1) --- Судно
Идентификаторы не могут никуда вписываться, так как принципиально не являются свойствами сущностей. Я теперь понимаю Ваши проблемы, ведь Вы не используете базы данных, а используете "реляционную технологию". Так нужно в самом первом сообщении сразу об этом говорить. Ведь раздел называется "Проектирование баз данных", а не "Проектирование реляционных баз данных"))
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38833005
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JeStone
Код: sql
1.
CREATE TABLE `документы_порт_вышка`

И для каждого нового типа - по новой таблице? о.О


Бредятина,

Запахло EAV или я не понял?
Пункт --- Является/Является (1:1) --- Судно - этого точно не понял :(
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38833065
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheerful CalfJeStone
Код: sql
1.
CREATE TABLE `документы_порт_вышка`

И для каждого нового типа - по новой таблице? о.О


Бредятина,

Запахло EAV или я не понял?
Пункт --- Является/Является (1:1) --- Судно - этого точно не понял :(
Значит я угадал - не понимаете(( Обычная БД, обычные сущности, обычные связи. Причем, первые две Вы вроде бы поняли, а последние - вроде бы не поняли))
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38833092
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бредятинаа последние - вроде бы не понялиНу и кто из нас не читает сообщения? ;)
Я же так прямо и написал - этого точно не понял. Прошу мол, разжевать. Ну или хотябы подсказать как именно выполнать жевательные движения :)
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38833093
JeStone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheerful CalfИ для каждого нового типа - по новой таблице? о.О

А что вас смущает? Это вполне распространенный прием. Вы же сами писали
автору документов разные, при чем это не только разные адреса (freetext), а ссылки на конкретные объекты, у которых уже потом могут быть разные адреса (поставщик) или не быть адреса вообще (судно), и прочие другие аттрибуты.

Или вы планируете хранить это все в сильно разреженной таблице?
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38833096
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JeStoneЭто вполне распространенный прием.Ну да, я много видел баз, где движение по складам организовано через 100 таблиц - склад1, склад2, ... . Есть в этом и повод поржать, о очевидные преимущества, но к такой структуре приду в последнюю очередь.
JeStoneв сильно разреженной таблицеНет, думаю хранить EqMovements (DocId = {1, 2, ...}, MovementType = {BS2RG, BS2BS, ...}, SenderObjectId {Id = 1, 2, ...}, DestinationObjectId {Id = 1, 2, ... }), где SenderObjectId может быть Id из таблицы BASES или RIGS или др. Этот вариант тоже не нравится - нет ссылочной целостности.
Другой - хранить EqMovements и отдельно EqMovementParticipants (EqMovementId, ParticipatnType {Sender, Receiver, Owner, Vendor, Approval, Prerequestor, Requestor, Holder...}, ParticipantId {Id = 1, 2, ...}), где ParticipantId может быть Id из вообще любой таблицы, причем даже той, которой уже давно не существует, что тоже не нравится.
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38833100
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheerful CalfЯ же так прямо и написал - этого точно не понял. Прошу мол, разжевать.
ЧАЛ гонит про свой любимый мумпс. Если коротко, то его идентификатор - это указатель, который соответственно может указывать на произвольную область памяти.
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38833119
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheerful Calf,

все 3 варианта нормальные
для целосности при желании можно и триггеры сгенерировать ( а так нафиг не нужны, лучше в приложени за этим следить)
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38833121
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cheerful CalfБредятинаа последние - вроде бы не понялиНу и кто из нас не читает сообщения? ;)
Я же так прямо и написал - этого точно не понял. Прошу мол, разжевать. Ну или хотябы подсказать как именно выполнать жевательные движения :)
Конечно, Вы))... Повторю, добавив в раздел сущностей еще две (думал, что это очевидно:

Документ: накладная на перемещение {Дата перемещения, ...}
Пункт {Наименование, ..., Наименование пункта, ...}
Человек {Фамилия, Имя, Отчество, ...}
Судно {Имя, ...}
---
Документ: накладная на перемещение <-- Из/ Из которого (М:1) --- Пункт
Документ: накладная на перемещение <-- В/ В который (М:1) --- Пункт
Пункт --- Является/Является (1:1) --- Человек
Пункт --- Является/Является (1:1) --- Судно

В данном фрагменте схемы БД четыре сущности (типа сущности) и четыре связи. Уточните, что Вам конкретно непонятно?) Я не могу просто поверить, что какие-то связи между типами сущностей понятны, а какие-то - непонятны((
...
Рейтинг: 0 / 0
Внешний ключ (и все-таки, как правильно) ?
    #38833122
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerCheerful CalfЯ же так прямо и написал - этого точно не понял. Прошу мол, разжевать.
ЧАЛ гонит про свой любимый мумпс. Если коротко, то его идентификатор - это указатель, который соответственно может указывать на произвольную область памяти.
Просто уже смешно из-за столь глубокого не понимания основ БД. Какой еще "мумпс"?? "Его идентификатор"?? "Указатель на область памяти"?? Что за бред, когда речь идет абсолютно на логическом уровне. Есть сущности и связи между ними, и нет (и даже теоретически не может быть) никаких указателей. И никаких проблем, в отличие от "реляционной технологии", бесконечные проблемы которой здесь и обсуждают перманентно))
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Внешний ключ (и все-таки, как правильно) ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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