客户和供应商数据库设计问题

时间:2009-04-13 18:19:36

标签: database-design

我正在开发一个Web应用程序,我将拥有客户和供应商。

最初我想过使用Customers表和Suppliers表。

然后当我考虑银行交易时,我注意到每笔交易都需要引用一个客户或供应商,所以我想使用一个名为Business的表来保存客户和供应商。

如果我想列出银行交易时使用客户和供应商表,我将在两个表中搜索以获取公司名称。

如果我使用Businesses表,我将不得不使用业务类型列,并为所有业务类型提供可能字段的联合。

有关设计的任何建议吗?

9 个答案:

答案 0 :(得分:4)

客户和供应商。错误。它是供应商和买家 - 标准商业业务关系的两个方面。术语“客户”是一个仅供营销部门使用的概念 - 其含义是基于上下文的,因此对于任何特定的业务流程来说都过于抽象。只有将Customer定义为一种关系类型(例如“买方”)才会有效 - 这似乎毫无意义且令人困惑。

两个阵营中可能存在一个组织/个人的想法完全是巧合。如果业务要求您知道某个给定方存在于两个业务关系中,那么他们必须能够以某种方式控制此信息 - 并且控制方法必须由业务决定 - 您无法发明它。必须有一个业务规则,使业务能够知道并记录同一方涉及两个不同方面。

如果业务规则不支持,则无法创建有效的数据结构。它真的很简单。

答案 1 :(得分:1)

您需要问的问题是客户和供应商之间的共同信息。如果信息(以及该信息的使用)大致相同,那么将它们存储在同一个表中可能就行了。如果信息(或其使用)大不相同,那么您应该将它们分开存储,并在包含银行交易所需的任何内容之间创建一个共同的视图。

答案 2 :(得分:1)

问题是,您的客户也可以成为供应商吗?在许多企业中,客户是从您那里购买的实体,而供应商是向您销售的企业,同一实体可以在不同时间执行这两项操作。在金融行业,这些被称为“交易对手”,我从未见过金融交易系统将它们区分为单独的表格。

答案 3 :(得分:0)

您的两个想法都是有效且正确的问题解决方案。要知道正确答案,您需要考虑应用程序的预期使用模式,以确定哪个更适合。例如,您是否会比单独列出客户和供应商更频繁地列出所有银行交易?

答案 4 :(得分:0)

对此的答案在于两个方面:a)两种类型的对象(客户和供应商)只是同一枚硬币的两面,或者它们根本不同,b)它是否会带来更易维护,更明智数据库架构?

您必须从业务逻辑角度和核心RDBMS角度考虑影响。能够在Transaction表中为Customer和Supplier表定义外键是否有价值?

您是否真的会在您的应用程序中进行搜索,其中客户结果和供应商结果会混合在一起?如果是这样,我建议只创建一个视图,将公共部分联合起来并保持表格分开。请记住,其他信息(如地址或电话号码)可以存储在其他谨慎的表格中,因此很多常见信息都会被重构。

答案 5 :(得分:0)

我不想重复其他人所说的内容,但是想在您的客户和供应商的特定用例中添加一个,根据您的域名需要注意的一点是客户可以是供应商。< / p>

让我们假装我们正在销售汽车零部件。经销商是客户,因为他们从其他经销商处购买零件(例如,当零件延期交货时)。因此,经销商既可以是客户,也可以是供应商。

我通常喜欢通过定义业务或公司实体来建立客户供应商关系,这定义了我们正在处理的人。姓名,地址等然后我会定义一个客户,即客户是企业,客户是企业的客户,这样您就可以拥有客户,客户也属于谁。然后,您可以使用有关该关系的其他信息来装饰您的客户。

您也可以与供应商做同样的事情。你也可以将它抽象出来并拥有一个单一的关系表,但它会变得错综复杂,而你却没有太大的收获而失去了一些意义。

答案 6 :(得分:0)

我认为您的最佳答案来自用户域。是否存在由相同用户(在相同角色中)共同维护的客户和供应商信息?如果是这样的话,如果他们可以在一个地方为两个目的而改变信息,他们会更容易。如果没有,你可以让他们改变彼此的数据,这不会让任何人高兴。

如果您有单独的采购和销售系统,并且需要与它们连接,则会出现同样的问题;或者拥有一个企业系统(在这种情况下,你可能应该与它的功能相匹配。)

问题 - 您是从用例或用户故事中得出您的要求还是......?

答案 7 :(得分:0)

如果要做出正确的决定–您必须考虑三种情况(谈论RDBMS):

  1. 第一种情况:查询速度(必须简单查询才能具有速度); 在这种情况下,如果您只想列出一项业务的所有银行交易,我将只列出一张表-业务。

  2. 第二个案例:复杂会计信息系统的数据库设计;根据与会计有关的付款订单中的条目获得的主要报告: 2.1。基于付款订单项目的应付帐款AP; 2.2。基于付款订单项目的应收帐款应收账款; 2.3。双重记账的对帐(在帐户分类帐中进行的输入) 2.4。作为供应商的税务管理(基于付款订单项目) 2.5。工人作为供应商(基于付款订单项目) 我只为客户制作一张桌子,为供应商制作另一张桌子。在这种情况下,表中必须有两个用于支付订单项目的字段(一个ID用于客户,另一个用于供应商,以提高查询速度)。

  3. 第三:简单业务的数据库设计;根据付款订单中的条目获得的主要报告: 3.1。基于付款订单项目的应收帐款应收账款; 3.2。作为供应商的税务管理(年度利得税); 我要列出一张表格:“业务”-如果您只想列出一项业务的所有银行交易。

答案 8 :(得分:0)

需要考虑的事项...您是否使用“CustomerNumber”和“SupplierNumber”?如果是这样,这些是相同的数字吗?如果不是,您可能需要将这些设置分解为指向相同相关数据的单独表(在企业表中)。

另一种方法是在 Businesses 表中有一个 CustomerNumber 列和一个 SupplierNumber 列,IMO 不正确并且可能会造成混淆。