【问题标题】:Create foreign key with non unique column in SQL Server在 SQL Server 中创建具有非唯一列的外键
【发布时间】:2012-02-17 23:00:18
【问题描述】:

我正在处理一个包含汽车和所有者的表(表CO)。我正在创建另一个表来包含所有者的属性(表OwnerAttributes),用户可以通过 GUI 分配该属性。我的问题在于所有者不是唯一的,因为我使用的是 SQL Server,所以我无法在它们上创建外键。表中有一个id,但它标识了汽车和车主作为一个整体。

我必须解决这个问题的想法是创建一个包含不同所有者的新表(表Owners),然后向表CO 添加一个触发器,该触发器将更新Owners 的任何更改。然后我可以将表 Owners 用于我的 OwnerAttributes 表并解决我的问题。

我想回答的问题是是否有更好的方法来做到这一点?

我正在使用一个预先存在的数据库,该数据库被旧应用程序大量使用。该应用程序连接到使用表CO 供车主和汽车使用。还有其他几个使用CO 表的表。我希望我可以将表格拆分为OwnersCars,但公司不希望我把所有时间都花在这上面,因为我需要向应用程序添加更多功能。

【问题讨论】:

标签: sql sql-server-2008


【解决方案1】:

您对 Owners 表的想法是正确的!您的问题是因为您的架构未标准化。事实上,您在一张表(您的表 CO)中存储了两件东西(汽车和车主)。

您应该创建一个 Owner 表是正确的,但是您应该从 CO 表中完全删除 Owner 信息,并将其替换为 Owners 表的外键。

所以你想要这样的东西:

CREATE TABLE Owner (
  ownerID int not null primary key indentity(1,0),
  FirstName varchar(255),
  LastName varchar(255),
  /* other fields here */
)
GO
CREATE TABLE Car
  carID int not null primary key identity(1,0),
  ownerID int not null references Owner(ownerID),
  /* other fields go here */
GO

/* a convenience, read only view to replace your old CAR OWNER table */
CREATE VIEW Car_Owner AS
  SELECT c.*, o.FirstName, o.LastName FROM Car c INNER JOIN Owner o ON c.ownerID = o.ownerID

现在,您已经在 SQL 中正确规范了所有内容。视图已将 car_owner 作为伪表中的一个东西返回给您。

但真正的答案是,规范化您的架构。让 SQL 做它最擅长的事情(将事物与其他事物联系起来)。将这两件事结合在一张桌子上只会导致更多问题,例如您在下游遇到的问题。

希望这个答案看起来很有帮助而不是居高临下,这就是我想要的!我已经学会了这种方法(标准化所有内容,让数据库做一些额外的工作来检索/显示/插入它)是最终唯一可行的方法。

【讨论】:

  • 在与公司的主要开发人员讨论后,决定这是要走的路,但由于时间限制,我不会实施。修复和测试应用程序的时间太长,收获太少。
【解决方案2】:

您应该创建 Owner 表、Car 表、OwnerCar 表(如果一个人可以有几辆车)。所有者表包含描述所有者(所有者属性)的字段

【讨论】:

  • 如果一辆车只能由一个人拥有(似乎是当前状态),您不需要 OwnerCar 表,只需将 fk_owner 添加到 Car 表中
  • 我正在使用一个现有的数据库,该数据库被旧应用程序大量使用。该应用程序连接到使用表 CO 为所有者和汽车。我希望我可以将表格分成 Owners 和 Cars,但公司不希望我把所有时间都花在这上面。
  • 您创建上面的结构,然后使用 CO 表的旧名称创建视图。旧代码仍然有效(但现在引用了视图),以后你可以正确地处理事情。
猜你喜欢
  • 2020-04-05
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多