DB设计付款表 -- mysql 领域 和 optimization 领域 和 relational-theory 领域 dba 相关 的问题

DB Design Payments Table


0
vote

问题

中文

我正在研究使用DB的桌面应用程序存储信息I.E(客户,房屋,专业人士,付款)。因此,该申请必须接受客户到公司,公司向客户(如果是退款),公司向所有者到公司的主人。此时我正在考虑这个付款表(有更多的列,数量,数量)。

  | id            | int(11)     | NO   | PRI | NULL    | auto_increment |  | type          | varchar(20) | YES  |     | NULL    |                |  | reference_id  | int(11)     | YES  |     | NULL    |                |   

使用此表我将使用ID作为唯一的付款ID,键入它是从公司,所有者,客户,ETX的付款。和参考资料是所有者,客户,ETX的唯一ID(我存储的原因是找到给该人发送或接收的所有付款)

由于某种原因,感觉就像一个丑陋的设计,不仅是因为我没有使用多对多的关系,而且因为你必须指定类型,它会有点棘手。

什么是更好的设计?

英文原文

I'm working on a Desktop application that uses a DB to store information i.e (customers, houses, proprietors, payments). So the application must accept payments from customers to company, company to customers(in case of a refund), company to proprietor, proprietor to company. At this moment i'm thinking about this Payments table(there is more columns like dates, quantity).

| id            | int(11)     | NO   | PRI | NULL    | auto_increment |  | type          | varchar(20) | YES  |     | NULL    |                |  | reference_id  | int(11)     | YES  |     | NULL    |                | 

With this table i was going to use id as the unique payment id, type to tell if it's a payment from company, proprietor, customer,etx.. and the reference_id is the unique id of the proprietor, customer, etx (the reason i store a reference_id is to find all the payments sent or received to that person)

For some reason it feels like an ugly design not only because i'm not using many-to-many relationship but also it gets kinda tricky to fetch data because you have to specify the type.

What would be a better design?

        
         
         

回答列表

0
 
vote
vote
最佳答案
 

更好的设计将是单个表格,将所有各方保留在付款中。如有必要,请将本表如此,所以公司,业主和客户拥有自己,独特的列(或单独,相关的表)。

The Payers Table将为 Parties 具有两个外键,让我们调用 PaymentFromPartyID PaymentToPartyID ,以及金额,日期等。这样可以跟踪金钱转移的所有排列。

找到一个人收到的所有款项

  select     sum(p.Amount) from Payments as p inner join Parties as y     on y.PartyID = p.PaymentToPartyID where y.Name = 'The person/company/proprietor of interest';   

附加细节

派对是任何人或任何兴趣付款的人。这将是一位专主,客户或公司,以型号为特色:

  Parties(     PartyID     PartyName     PartyType     -- customer or company or proprietor     <customer-fields>     <proprietor-fields>     <company-fields>)   
付款将付款人(任何类型)与收款人(任何类型)相关联:
  Payments(     PaymentFromPartyID  -- FK to Parties.PartyID     PaymentToPartyID    -- FK to Parties.PartyID     Amount     Date     etc.)   

从中使用的ID在金钱流动的方向上。不需要有关于付款表中的一方的任何信息,例如两方面的类型。

要获取给客户(例如)为客户添加 Parties.PartyType = 'Customer' 给上面给出的查询。

The The The The Track表您列出的所有属性我在此处列出(栏几个代理ID)但是归一化。

 

A better design would be to have a single table to hold all the parties to a payment. If necessary, sub-type this table so companies, proprietors and customers have their own, unique sets of columns (or a separate, related table).

The payments table will then have two foreign keys to Parties, let's call them PaymentFromPartyID and PaymentToPartyID, along with amount, date etc. This way all permutations of money transfer can be tracked.

To find all the monies a person has received use

select     sum(p.Amount) from Payments as p inner join Parties as y     on y.PartyID = p.PaymentToPartyID where y.Name = 'The person/company/proprietor of interest'; 

Additional Detail

A party is anyone or anything who has in interest in a payment. This would be a proprietor, customer or company, distinguished by a type:

Parties(     PartyID     PartyName     PartyType     -- customer or company or proprietor     <customer-fields>     <proprietor-fields>     <company-fields>) 

A payment relates a payer (of any type) to a payee (of any type):

Payments(     PaymentFromPartyID  -- FK to Parties.PartyID     PaymentToPartyID    -- FK to Parties.PartyID     Amount     Date     etc.) 

The IDs used in From and To says in which direction the money flows. There is no need to have any information about a party in the Payments table, such as a type, other than the two PartyIDs.

To get all the payments made to customers (for example) add Parties.PartyType = 'Customer' to the query given above.

The Payments_Track table you list has all the attributes I list here (bar a few surrogate IDs) but is normalised.

 
 
     
     
0
 
vote

如果它不存在

,则首先为参考ID创建表
  | ref_id            | int(11)     | NO   | PRI | NULL    | auto_increment |   | reference_id      | int(11)     | YES  |     | NULL    |                |  

然后创建另一个表来存储类型

  | type_id            | int(11)     | NO   | PRI | NULL    | auto_increment |   PaymentFromPartyID0  

创建另一个表以将类型与参考

匹配
  PaymentFromPartyID1   PaymentFromPartyID2   PaymentFromPartyID3  

这样,您可以在将来轻松添加更多类型,如果可用类型也获取列表。使它整洁,有点组织。

 

First create a table for reference id if it does not exist

 | ref_id            | int(11)     | NO   | PRI | NULL    | auto_increment | | reference_id      | int(11)     | YES  |     | NULL    |                | 

then create another table to store the types

 | type_id            | int(11)     | NO   | PRI | NULL    | auto_increment | | type               | varchar(20) | YES  |     | NULL    |                | 

create another table to match the type with the reference

 | id               | int(11)     | NO   | PRI | NULL    | auto_increment | | type_id          | int(11)     | YES  |     | NULL    |                | | ref_id           | int(11)     | YES  |     | NULL    |                | 

This way, you can easily add more types in the future, get the list if available types too. Makes it neat and kinda organised.

 
 
   
   

相关问题

1  禁用MySQL复制  ( Disable mysql replication ) 
我正在运行以下: # cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.6 (Santiago) # uname -a Linux X 2.6.32-504.3.3.el6.x86_64 #1 SMP Fri Dec 12 16:...

1  从文本文件中读取插入语句  ( Read insert statements from text file ) 
好日子, 我有1000个文本文件,每个文件都包含1000个插入到语句。什么是最有效的方式来读取和将每个插入语句读取到MySQL DB表中? 感谢您的任何帮助。 ...

1  eav - count()/ sum()在列和行值上,没有空  ( Eav count sum on column and row values with and without nulls ) 
假设有一个表 演示 与这些数据: id userid title 数据 1 1 日期 01-01-2021 2 1 颜色 红色 3 2 日期 4 2 颜色 黄色 5 3 日期 04-01-2021 6 3 ...

0  迁移时区时间戳  ( Migrating timezone timestamps ) 
我正在尝试迁移这个节点库 https://github.com/localseoguide/lighthouse-reporter 从postgres到mysql并收到错误 error: ER_TRUNCATED_WRONG_VALUE: Incorrect datetime value: '2020-03-22T2...

1  MySQL部分交易  ( Mysql partial transactions ) 
我正在使用交易在MySQL中遇到一些奇怪的行为。我们有一个PHP网站,运行〜100个工作站每天插入数千个物品(表1),创建时有4到7个记录的事件(表2)。我们每天大约3次,我们的插入件成功。最多3个MySQL用户可以从PHP调用,并且涉及的ODBC源,所以希望我解释得足够好。不幸的是,PHP是来自前一个DEV的意大利...

1  InnoDB更新延迟记录  ( Innodb updates records with delay ) 
我在数据的数据库中有两个表: CREATE SCHEMA PUBLIC AUTHORIZATION DBA; CREATE CACHED TABLE Users(UserID NUMERIC(15) NOT NULL PRIMARY KEY, FirstName VARCHAR(50), LastName VA...

1  MySQL Optimizer为相同查询的意外结果?  ( Unexpected result by mysql optimizer for identical queries ) 
在查询之后,正好工作,并使用索引 查询需要0,0481秒 SELECT geodb_locations.name, geodb_locations.name_url, COUNT(user.uid) AS useranzahl FROM user LEFT JOIN ...

1  数据库架构 - 性能v正确性信息  ( Database schema performance v correctness information ) 
我有一个数据库,可以存储有关我网站用户(用户名,密码等)的信息。我还在网站上存储有关他们活动的信息。 例如,我的网站上有大量问题。我有几个主题,每个主题都有很多问题。 每当用户回答问题时,我将结果存储在包含元组的表中:( user_id,question_id,timessswered,timescorrect) 我...

2  MySQL Replication为某些表而异  ( Mysql replication goes out of sync for some tables ) 
我们在Redhat系统上运行MySQL 5.1.61,并具有以下设置 一个大师和四个奴隶从主机复制,我们最近添加了一个新的奴隶进行了复制,在几天后我们已经开始注意到,在新添加的从属的一些表(不是全部)宽松的一些记录,这仅发生在某些记录中这个奴隶和它不规则,在3周内这个问题似乎发生在5-7天。 我们使用基于语句的复制。...

1  为什么复制停止?  ( Why is replication stopped ) 
今天早上有以下Nagios警报,为我们的MySQL副本: 14:49问题:MySQL2 / MySQL复制检查至关重要,10.1.0.133是72870秒后面,8月9日,21:49 UTC 当我看起来 SHOW SLAVE STATUS 在副本上时,我通常看起来的地方很好: create table fo...

0  触发将两个列从不同表中的乘以mysql中的函数乘以  ( Trigger for multiplying two columns from different tables with a functions in my ) 
我一直在尝试获得一个触发器工作,有许多不同的变化和所有结束的错误。 我终于决定寻求帮助,因为我仍然是一个初学者。 所以说我有一个多对多的表,其中包含 o.orderid 和 p.productid < / strong>,在此表中,我有两个称为 和 totalprice 我已经创建了一个函数,它根据它...

0  授予对所有数据库的用户“root”,但最少特定的访问权限  ( Grant access to user root to all databases but least specific one ) 
我有用户:root,lmanager。 还有一些数据库:DB1,DB2,DB3,... 除了DB2之外,我希望将所有权限授予用户"root" 以外的所有数据库。 用户'LManager'只会将所有权限获取到DB2。 可以使它工作? 可以向用户root制作DB2'不可见'? 如果是可能的话,我怎么能做到? 提前谢谢! ...

0  在MySQL中自动撤消版本控件  ( Automatic undo for version control in mysql ) 
我不是一个mysql专家,但似乎没有明显的方法来做到这一点。 我会解释我想要的东西。 假设我正在进行数据迁移,这将在某些表中更新一些行。 我希望能够备份,执行迁移脚本并自动获取撤消脚本。 我不明白为什么这应该是不可能的,因为RDBMS存储了已经用于事务的日志中的所有更改(MySQL具有 Abcdefghijklmna...

0  在同一NetWrok的不同系统中的两个本地MySQL数据库之间的数据同步  ( Data sync between two local mysql databases in different system in same netwrok ) 
我正在使用mysql作为数据库,为我的应用程序和失败的目的,我需要在系统2中的系统1中的一个本地MySQL数据库中的数据同步通过同一网络连接的其他本地数据库。所以我想要知道如何在其他系统中连接本地数据库并自动同步数据 ...

4  MySQL慢日志配置  ( Mysql slow log configuration ) 
是否有一种方法可以让MySQL慢日志每天开始新的日志文件? 目前它只是一个大型文件,并且每天都有Grep行。为每天慢日志具有单独的文件会更方便。 我是否必须配置My.cnf或某些Linux功能? ...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.