【问题标题】:Customers and suppliers database design issue客户和供应商数据库设计问题
【发布时间】:2010-10-19 04:40:50
【问题描述】:

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

最初我考虑使用 Customers 表和 Suppliers 表。

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

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

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

对设计有什么建议吗?

【问题讨论】:

    标签: database-design


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          您的两个想法都是对您的问题有效且正确的解决方案。要知道正确的答案,您需要考虑您的应用的预期使用模式来决定哪个更可取。例如,与分别列出客户和供应商相比,您是否会更频繁地列出所有银行交易?

          【讨论】:

            【解决方案5】:

            这个问题的答案在于两个方面:a) 两种类型的对象(客户和供应商)只是同一枚硬币的两个面,还是根本不同,b) 是否会导致更易于维护、更合理数据库架构?

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

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

            【讨论】:

              【解决方案6】:

              我不想重复其他人所说的话,但想在您的客户和供应商的特定用例中添加这一点,根据您的域需要注意的一件事是客户可能是供应商。

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

              我通常喜欢通过定义业务或公司实体来模拟客户供应商关系,这定义了我们与谁打交道。姓名、地址等。然后我会定义一个客户,客户是企业,客户是企业的客户,这样您就可以知道客户是谁,客户也属于谁。然后,您可以使用有关该关系的其他信息来装饰您的客户。

              您可以对供应商做同样的事情。您也可以将其抽象出来并拥有一个单一的关系表,但它会变得令人费解,并且您会失去一些含义而没有太多收获。

              【讨论】:

                【解决方案7】:

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

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

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

                【讨论】:

                  【解决方案8】:

                  如果你想做出正确的决定——你必须考虑三种情况(谈到 RDBMS):

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

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

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

                  【讨论】:

                    【解决方案9】:

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

                    替代方法是在 Businesses 表中包含 CustomerNumber 列和 SupplierNumber 列,IMO 不正确并且可能会造成混淆。

                    【讨论】:

                      猜你喜欢
                      • 2021-04-20
                      • 1970-01-01
                      • 2020-11-06
                      • 1970-01-01
                      • 1970-01-01
                      • 2021-09-15
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多