Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库设计:独特的计费关联_Sql_Database_Tsql_Database Design - Fatal编程技术网

Sql 数据库设计:独特的计费关联

Sql 数据库设计:独特的计费关联,sql,database,tsql,database-design,Sql,Database,Tsql,Database Design,我们公司正在重新设计一个旧数据库。我们遇到了一个需要展示的关联,但不确定最好的处理方式。我们的业务逻辑是,我们的客户(称为分销商)将始终有付款条件。然而,其中一些账户的付款条件将由一个单独的分销商账户控制(例如:想想连锁店,所有的账单都通过一个公司账户) 我们已经提出了一些解决方案,并希望得到一些反馈,说明哪一个方案最可行,或者我们是否应该以不同的方式处理这个账单关联 解决方案#1 因为每个帐户都有付款条件,所以它们会反映在Distributors表中。然后在单独的表中进行关联 Distribu

我们公司正在重新设计一个旧数据库。我们遇到了一个需要展示的关联,但不确定最好的处理方式。我们的业务逻辑是,我们的客户(称为分销商)将始终有付款条件。然而,其中一些账户的付款条件将由一个单独的分销商账户控制(例如:想想连锁店,所有的账单都通过一个公司账户)

我们已经提出了一些解决方案,并希望得到一些反馈,说明哪一个方案最可行,或者我们是否应该以不同的方式处理这个账单关联

解决方案#1 因为每个帐户都有付款条件,所以它们会反映在Distributors表中。然后在单独的表中进行关联

DistributorBillingAssociations
------------------------------
DistributorId
BillingDistributorId (points to DistibutorId of Distributors table)
现在,您依赖于业务逻辑来确保付款条件与账单帐户匹配。这个解决方案的最大问题是设计不直观。未来用户很难知道付款条件是由账单关联表驱动的

解决方案#2 如果分销商没有自己的付款条款,则该列将设置为null,通过自我引用,您将知道使用分销商设置的付款条款作为计费帐户

欢迎任何反馈或建议。

我会选择解决方案2,因为我认为它最符合逻辑:

if (PaymentTermsId=null) PaymentTerms=(PaymentTermsFor(BillingAccountId))
   else PaymenntTerms=PaymentTermsFor(PaymentTermsID)

我会为每个支付实体(无论是单个分销商还是企业集团)设置paymentTermsID,然后从分销商表到支付条款表设置FK。 如果有许多分销商具有相同的付款条件,他们只需在“付款条件”表中引用相同的记录。 这避免了数据查询中任何可能混淆的ifnull逻辑

select * from Distributors
left join PaymentTerms
  on Distributors.paymentTermsID = PaymentTerms.PaymentTermsID
我已经在sqlfiddle上画了一个草图,看一看,然后到处玩

这个问题看起来像是对代码编写服务的请求。除了需求定义之外,请包括您的SQL查询、示例数据并突出显示问题部分。最好是,作为一个指南,如果问题出现在白板上,它是一个概念性的问题,应该转到,如果它出现在屏幕上的代码中,那么它就属于这里,最好是与您一直停留在上面的代码片段一起。我只想指出我不同意前面的评论-这是一个数据库设计问题(我们有很多这样的标签),询问者已经提供了两个解决方案。它只是询问根据所描述的需求使用哪一个,或者它们是否缺少另一个选项-这与许多其他可接受的数据库设计问题是一致的,这一个已经非常清楚地说明了。我将尝试在午餐时间或今晚回答,如果还没有回答的话甚至当时还没有回答。@AlexBell-我不是在寻找任何代码编写,我的目的是纯粹从数据库设计的角度获得关于处理这种独特关联的最佳方法的反馈和建议。如果我理解正确,在解决方案2中,PaymentTermsID为null,或者BillingAccountID为null,但不是两者都为null?如果我是的,那么解决方案2更具表现力。此解决方案的唯一问题是我们不知道谁在控制单个分销商的付款条件。如果存在这种关系,则需要显示这种关系,因为它将成为未来报告需求的一部分。
if (PaymentTermsId=null) PaymentTerms=(PaymentTermsFor(BillingAccountId))
   else PaymenntTerms=PaymentTermsFor(PaymentTermsID)
select * from Distributors
left join PaymentTerms
  on Distributors.paymentTermsID = PaymentTerms.PaymentTermsID