我必须将 Firebird 数据库迁移到 MS SQL,并且原作者以具有可变主键的方式设计数据库。例如,我们有一个表
PRODUCTS with primary key (NAME,CATEGORY,SHORTNAME) and some data
PRICE_LISTING (NAME,CATEGORY,SHORTNAME) - foreign key to PRODUCT, and some data like price
PRODUCT_ALTERNATIVES (ORIGINAL_NAME,ORIGINAL_CATEGORY,ORIGINAL_SHORTNAME; REPLACEMENT_NAME,REPLACEMENT_CATEGORY,REPLACEMENT_SHORTNAME) - foreign keys to PRODUCTS
如您所见,每当产品名称更改时,其他表中的大量数据都必须更改。原作者通过外键的级联更新解决了这个问题。由于某些原因,MS SQL 不允许我在外键上使用级联更新,因此无法轻松迁移数据库。
更糟糕的是,该软件有很多编辑屏幕,使用 DataSets、DataGridViews 和 Windows 窗体中的绑定,因此编辑器几乎可以自动运行。例如,editor forPRODUCTS
是一个简单的 windows 窗体,每当用户重命名产品(更改其NAME
)时,更改都会通过数据库(通过级联更新)传播到PRICE_LISTING
表PRODUCT_ALTERNATIVES
。而且,如果应用程序想要显示价格列表,它很简单SELECT * FROM PRICE_LISTING
,包括产品名称和价格。
一种方法可能是向ID
每个表添加代理键 - 标识列,然后将例如PRICE_LISTING
表修改为 ( PRODUCT_ID, price
) 等。但是,为了显示价格,我必须定义将
SELECT *,PRODUCT.NAME,PRODUCT.CATEGORY,PRODUCT.SHORTNAME FROM PRICE_LISTING join PRODUCT on ...
然后,必须修改自动生成的 DataSets 等以从视图中选择,更新视图。
简而言之,从原作者的角度来看,我们正在破坏程序并使其变得更加复杂。以直接方式移植时唯一不起作用的是级联更新,但我发现数据库设计存在很大缺陷,如果不修复将是维护的噩梦。
该怎么办?