数据库设计问题(FK到不同的表)

时间:2011-01-17 13:43:01

标签: database-design rdbms

考虑购物车,允许客户使用可变支付系统。

每个系统都有一组不同的参数:系统A具有引用id,xml响应,事务id,系统B具有事务id和状态等属性,系统C(Check)只有支付日期。每个系统的状态也不同。

在支付系统选择页面上,有支付系统的名称和描述,这些名称和描述也将存储在数据库中(例如,未硬编码为HTML)。

您将如何设计数据库?

我能想到的最好的事情是为每个系统提供一个表格+一个表格,用于支付系统描述链接到相关表格的名称+订单表格中的2个额外字段:支付系统ID(将链接到“描述”表“),支付记录ID(将链接到相关支付系统表中的ID)。这还允许在支付系统模型之间提供特定功能(订单通知处理等),而不是使用if。好吗?

如果有的话,该项目基于PHP 5,Doctrine和MySQL。

3 个答案:

答案 0 :(得分:2)

可以说你可以有一个主系统表,其中包含任何公共信息(一个id,一个名字,等等),然后是第二个表,它收集属性的名称/值对:

CREATE TABLE system_table
(id int,
name char(50),
...
);

CREATE TABLE system_properties
(system_id int,
name char(50),
value varchar
);

由于属性的模糊映射,这可能对人们没有吸引力,但另一方面,获取任何系统的属性变成了一个简单的连接,而不是试图将几个表拉到一起。

请注意,上面的SQL create语句是伪代码。

答案 1 :(得分:1)

支付系统的每个类型的一个表 - 该类型是一个或多个支付系统共有的唯一属性集。拥有包含所有类型共享的所有类型的父表(例如系统名称)。

答案 2 :(得分:0)

什么dportas和jaydel说加上我的两分钱。

每个支付系统应该在一个表的一行中,而不是在它自己的表中。每种类型的支付系统(专用支付系统)都需要一个自己的表格,用于仅为该类型收集的数据。

此外,应该有一个通用的支付系统表,其中包含与所有类型的支付系统相关的数据。

通用支付系统表与专业支付系统表之间的关系是经典的“gen = spec desing pattern”。如果你查找“泛化专业化关系建模”,你会发现教你如何为gen-spec模式设计关系表的文章。

简短的回答是gen表有一个充当PK的经典ID字段。每个专用表都有一个ID字段,它与gen表中的ID字段重复。这意味着它既是专业领域的PK又是引用gen表的FK。

FK对数据库中其他地方的支付系统的引用应该引用gen表。