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

Database design 数据库设计问题(FK到不同的表),database-design,rdbms,Database Design,Rdbms,考虑购物车,允许客户使用可变支付系统 每个系统都有一组不同的参数:系统a有参考id、xml响应、事务id等属性,系统B有事务id和状态,系统C(支票)只有付款日期。每个系统的状态也不同 在“付款系统选择”页面上有付款系统的名称和说明,这些名称和说明也将存储在数据库中(例如,未硬编码为HTML) 您将如何设计数据库 我能想到的最好的事情是为每个系统创建一个表+一个用于支付系统描述的表,链接到相关表的名称+订单表中的2个额外字段:支付系统id(将链接到“描述表”)、支付记录id(将链接到相关支付系统

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

每个系统都有一组不同的参数:系统a有参考id、xml响应、事务id等属性,系统B有事务id和状态,系统C(支票)只有付款日期。每个系统的状态也不同

在“付款系统选择”页面上有付款系统的名称和说明,这些名称和说明也将存储在数据库中(例如,未硬编码为HTML)

您将如何设计数据库

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


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

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

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

CREATE TABLE system_properties
(system_id int,
name char(50),
value varchar
);
由于属性的模糊映射,这可能对人们没有吸引力,但另一方面,获取任何系统的属性就变成了一个简单的连接,而不是试图将几个表拉到一起


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

每种类型的支付系统对应一个表-该类型是一个或多个支付系统通用的唯一属性集。拥有所有这些类型的父表,其中包含所有这些类型共享的属性(例如系统名称)。

dportas和jaydel所说的加上我的2美分

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

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

通用支付系统表和专用支付系统表之间的关系是一种经典的“gen=spec设计模式”。如果您查找“泛化-专业化-关系建模”,您将发现一些文章,它们教您如何为genspec模式设计关系表

简而言之,gen表有一个经典的ID字段作为PK。每个专用表都有一个ID字段,该字段与gen表中的ID字段重复。这意味着它既是专用字段中的PK,也是引用gen表的FK

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