Создание таблицы с полем (с внешним ключом), которое может ссылаться на множество таблиц и поддерживать ссылочную целостность?

как лучше всего создать таблицу, которая может содержать ключ ко многим другим таблицам? Насколько я знаю, у меня есть два варианта:
1) Я создаю таблицу с большим количеством полей внешнего ключа;
2) Я создаю два поля, одно из которых указывает на указанную таблицу, а другое - с первичным ключом. этой таблицы.

У последнего есть много проблем из-за того, что нет возможности поддерживать ссылочную целостность (потому что нет внешнего ключа для каждой таблицы).

Помимо ссылки на эту таблицу, я хочу добавить описание, чтобы отображать все уведомления в виде сетки. Щелкнув линию в сетке, я хочу открыть соответствующую программу и исправить проблему в этой программе.

Это немного сложно объяснить, возможно, этот пример объясняет лучше:
Мне нужно создать систему, которая обрабатывает задачи / заметки / уведомления для каждой программы в нашем бизнес-приложении. У нас есть счета-фактуры, заказы на продажу, поставки, заказы на производство и т. Д. Наше программное обеспечение обнаруживает, что что-то не так, что-то из перечисленного. Например, если прибыль по заказу на продажу недостаточно высока, заказ не может быть подтвержден автоматически. В этом случае я хочу создать уведомление для менеджера по продажам, чтобы он мог проверить, что не так с заказом на продажу.

К вашему сведению: я использую Sybase SQL Anywhere 12.

Есть ли в этом смысл?


person TedOnTheNet    schedule 12.11.2013    source источник
comment
Есть возможность установить целостность ссылки для # 2, вы этого хотите? Это работает, но выглядит не очень хорошо.   -  person LINQ2Vodka    schedule 12.11.2013


Ответы (1)


Решить это можно и наоборот. Допустим, у вас есть таблица Alerts, в которую вы собираетесь помещать всевозможные предупреждения о плохих вещах, произошедших в другом месте. Вы можете ссылаться на эту таблицу из ВСЕХ других таблиц в вашей системе и создавать на их основе необязательные отношения. Вкратце это может выглядеть так (я использую синтаксис MSSQL):

create table Alerts(
   ID int not null identity,
   SomeInfoAboutTheProblem varchar(255),
   constraint PK_Alerts primary key (ID)
)

create table Invoices(
   ID....
   AlertID int NULL,
  ....
   constraint FK_Invoices2Alerts foreign key (AlertID) references Alerts(ID)
)

Если вы не можете изменить свои таблицы с помощью бизнес-информации, вы можете создать "расширенную" таблицу для Alerts, в которой может храниться некоторая конкретная информация о проблеме и фактическая ссылка на проблемную запись. Например:

create table Alerts(
   ID int not null identity,
   SomeInfoAboutTheProblem varchar(255),
   constraint PK_Alerts primary key (ID)
)
create table Alerts_for_Invoices(
   AlertID int NOT NULL,
   InvoiceID int NOT NULL,
   SomeAdditionalInvoiceProblemInfo ....,
   constraint FK_Alerts_for_Invoices2Alerts foreign key (AlertID) references(ID),
   constraint FK_Alerts_for_Invoices2Invoices foreign key (InvoiceID) references Invoices(ID)
)

Чтобы отобразить список проблем, вы можете просто выбрать общую информацию из таблицы предупреждений, открывая диалоговое окно, вы можете выбрать всю соответствующую информацию, касающуюся проблемы.

person Pavel Kutakov    schedule 12.11.2013