我正在处理一个包含汽车和所有者的表格(表格CO
)。我正在创建另一个表来包含所有者(表OwnerAttributes
)的属性,用户可以通过GUI分配这些属性。我的问题在于所有者不是唯一的,因为我使用SQL Server,我无法在它们上创建外键。表中有一个id,但它标识了汽车和所有者的整体。
我必须解决此问题的想法是创建一个包含不同所有者的新表(表Owners
),然后向表CO
添加一个更新{{1}的触发器任何改变。然后我可以将表Owners
用于我的Owners
表并解决我的问题。
我想回答的问题是,是否有更好的方法可以做到这一点?
我正在使用旧的应用程序大量使用的预先存在的数据库。连接应用程序以将表OwnerAttributes
用于所有者和汽车。还存在其他几个使用CO
表的表。我希望我可以将表格拆分为CO
和Owners
,但该公司不希望我花费所有时间来完成这项工作,因为我需要向应用程序添加更多功能。< / p>
答案 0 :(得分:2)
你应该创建所有者表,Car表,OwnerCar表(如果有人可以有几辆车)。所有者表包含描述所有者(所有者属性)
的字段答案 1 :(得分:2)
您对车主表的想法是正确的!您的问题是因为您的架构未规范化。事实上,你将两件事(汽车和车主)存放在一张桌子上(你的桌子CO)。
你应该创建一个Owner表是正确的,但是你应该完全从CO表中删除所有者信息,并用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做它最擅长的事情(将事情与其他事物联系起来)。将这两个东西组合在一张桌子上只会导致更多问题,比如你遇到下游问题。
希望这个答案看起来很有帮助,而不是居高临下,这就是我想要的!我已经学会了这种方法(规范化所有内容,让数据库做一些额外的工作来检索/显示/插入它)的困难方法,这是迄今为止唯一可行的方法。