我正在为住房协会设计计费结构。
需要做哪些改变?
我在哪里发布社会余额(借方、贷方),例如费用建筑保险和收入,例如广告板囤积?
如何处理余额审计跟踪(将其放在交易ID为FK的单独表的交易表中)?
所有表默认都有创建和修改时间、创建者和IP地址。
billingstatement
id | description | amount | Bill Month | userId | societyId
1 | Maint Chrg 1000 sqft x 5 per sqft | 5000 | Aug-16 | 1001 | 101
2 | Water Charges | 200 | Aug-16 | 1001 | 101
3 | Construction Charges | 300 | Aug-16 | 1001 | 101
4 | Reserved Parking chrgs | 500 | Aug-16 | 1001 | 101
accounts
id | balance(current bal) | societyId | modifiedTime |
1 | -6000 | 101 | 2016-01-01 21:01:01 |
2 | -5000 | 101 | 2016-01-01 21:01:01 |
3 | 1000 | 101 | 2016-01-01 21:01:01 |
transaction
id | amount | balance | trans_type | trans_time | account_id |
1 | 6000 | 0 | 1 | 2016-01-01 21:01:01 | 1 |
2 | 5500 | -6000 | 1 | 2016-02-01 21:01:01 | 2 |
tran_type
:1=用户付费,2=社会收入,3=社会支出
map_account_user
map_id | account_id | user_id
1 | 2 | 1001
如果帐户映射不存在,则它是社会帐户而不是用户帐户。
我对于将聚合与实体存储在一起犹豫不决。除非总数非常难以计算,否则您应该始终通过检查细节来解释这些。
我假设您正在设计一个关系数据库。 在关系数据库中,您可以对数据进行“标准化”。 我在遵循您的数据库设计时遇到困难,因为您有太多称为 id 的不同字段。 每个 id 字段应该有一个唯一的名称,这样人们就可以知道不同的 id 字段代表什么。
让我们从事务表开始。 通常表名是单数。 我将表名和列名大写。 您不必遵守该约定。
Transaction
-----------
Transaction ID
Transaction Type
User ID
Society Account
Transaction Amount
Transaction Time Stamp
...
交易ID是一个自增整数。 它也是事务表的主(集群)键。 交易类型为1=用户支付,2=社会收入,3=社会支出。 我不确定交易类型 1 和交易类型 2 之间有什么区别。
填写用户 ID 或社团账户栏。交易类型 1 填写用户 ID 栏,交易类型 2 和 3 填写社团账户栏。未填写栏设置为空。
交易金额始终为正值。 您的代码将从交易类型 3 的协会账户中减去交易金额。
您将为(用户 ID、交易时间戳降序、交易 ID)创建唯一索引,并为(社团账户、交易时间戳降序、交易 ID)创建唯一索引。 这使您可以快速获取用户或社区帐户在给定月份的所有交易。
接下来,我们看一下UserAccountBalance表。
UserAccountBalance
------------------
User ID
Balance Year and Month
Balance Amount
...
该表的主键是(用户 ID、余额年份和月份降序)。 您维护每个用户 ID 每月的历史余额。 这允许审计员通过对交易表运行查询来验证余额。
接下来,让我们看看 SocietyAccountBalance 表。
SocietyAccountBalance
---------------------
Society Account
Balance Year and Month
Balance Amount
...
此表与 UserAccountBalance 表类似,但适用于协会帐户。
接下来我们看一下账单表
Billing
-------
User ID
Billing Year and Month
Billing Type
Square Feet
Charge per Square Foot
Total Charge
...
主键是(用户 ID、计费年份和月份降序、计费类型)。 我假设您每月每种计费类型仅收取一笔计费费用。
计费类型为1=维护费、2=水费、3=施工费、4=预留停车费。 您可以根据此表中的值生成帐单上的文本,因此无需将文本存储在数据库中。 对于计费类型 1,请填写“平方英尺”和“每平方英尺费用”列,否则为空。
您仍然需要将付款与帐单相匹配,但这应该足以让您开始走上正确的道路。
account_id在某些地方被引用 但在账户表中它是 Id。
我会将其设为帐户表中的 account_id。 这使得您可以更轻松地找到数据库用户可以加入的位置。 您称之为“Account_Id”的每个地方都应该与生成它的单个主表具有相同的 Account_Id。
我们开始吧。如果您使用描述列的数据:
{水费
施工费
预留停车位变更}
作为新列,您的行数将会减少,并且您可以进行高效的数据维护。对于每个 userId,您可以拥有单行数据,而不是维护四行。只需验证下面提供的示例即可。
对于每平方英尺,您可以单独有一个描述栏。
id | userId | societyId | BillMonth | MaintChrg | WaterCharges | ConstructionCharges | ReservedParkingCharges | Description
1 | 1001 | 101 | Aug-16 | 5000 | 200 | 300 | 500 | Maint Chrg 1000 sqft x 5 per sqft
2 | 1002 | 101 | Aug-16 | 4000 | 200 | 300 | 500 | Maint Chrg 900 sqft x 5 per sqft
3 | 1003 | 102 | Aug-16 | 5000 | 200 | 300 | 500 | Maint Chrg 900 sqft x 5 per sqft
对于您对借记卡和贷记卡的使用有疑问:
借记为费用Bldginsurance
信用为Adv板囤积
您还可以添加其他栏目,如用户名、人数、电费等