【问题标题】:Creating a table with a field (with a foreign key) which can reference many tables and maintain referencial integrity?使用可以引用许多表并保持引用完整性的字段(带有外键)创建表?
【发布时间】:2013-11-12 11:09:58
【问题描述】:

创建一个可以保存许多其他表的键的表的最佳方法是什么? 据我所知,我有两个选择:
1) 我创建了一个包含很多外键字段的表
2) 我创建了两个字段,一个表示引用的表,另一个表示该表的主键。

后者存在很多问题,因为无法保持参照完整性(因为每个表都没有外键)。

除了指向此表的链接之外,我还想添加说明,以便可以在网格中显示所有通知。通过单击网格中的一行,我想打开相应的程序并修复该程序中的问题。

有点难解释,也许这个例子解释得更好:
我需要创建一个系统来处理我们业务应用程序中每个程序的任务/注释/通知。我们有发票、销售订单、交货、生产订单等 我们的软件检测到其中任何一个有问题。例如,如果销售订单的利润不够高,则无法自动验证订单。在这种情况下,我想为销售经理创建一个通知,以便他检查销售订单出了什么问题。

仅供参考:我正在使用 Sybase SQL Anywhere 12。

这有意义吗?

【问题讨论】:

  • 有一个选项可以为#2 设置参考完整性,你想要吗?它有效,但看起来不太好。

标签: sql sybase sqlanywhere


【解决方案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)
)

要显示问题列表,您可以在打开对话框时从警报表中选择一般信息,您可以选择所有与问题相关的适当信息。

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多