我需要有关数据库设计的建议。
我目前正在为学校设计DBMS。在设计了课程和考试表之后,现在我来了费用模块。
这是我到目前为止所做的。 我创建了4个表,如下所示:
fee_type
-------------
fee_type_id PRIMARY KEY
fee_type TYPE OF FEE (MONTHLY, WEEKLY,ANNUAL,ONE TIME)
fees
-------------
fees_id PRIMARY KEY
fee_heading (eg. TUITION FEE,LAB FEE, HOSTEL FEE,SPORTS FEE)
amount (CURRENT CHARGE OF THE FEE, could change with time)
class_id (GRADE ID, GARDE 4, GARDE 5, GRADE 6)
fee_type TYPE OF FEE (MONTHLY, WEEKLY,ANNUAL,ONE TIME)
archived (FEE HEADING ARCHIVED FOR USE)
fee_student
-------------
fee_id (RELATED fee_id (FK))
student_id (RELATED student_id(FK))
effective_from (DATE FROM WHEN THE FEE APPLIES TO THE STUDENT)
amount (CHARGE AT THE TIME OF FEE ASSIGNMENT (applicable to particular student))
discount (DISCOUNT HONORED TO STUDENT IF ANY)
status (ACTIVE OR INACTIVE)
transaction
---------------
id PRIMARY KEY
date (date and time when transaction takes place)
fee_id (PAYMENT FOR)
student_id ({TO BE} PAID BY)
amount ( AMOUNT PAID/APPLIED)
description
cr ( yes or no)
dr (yes or no)
remarks
交易表将存储学生的所有付款以及该学生的所有费用。
我正在考虑根据fee_type存储在交易表中向学生收取的金额。这意味着,如果费用是每周类型,每周一条记录将自动添加到交易表中,金额被标记为借方(或贷方,无论如何)。
希望它有意义。
我是否正确地设计数据库?
非常感谢您的意见和建议。
谢谢
比什努
答案 0 :(得分:0)
您的设计走在正确的轨道上。几条评论:
fees.fee_type
应该是fees.fee_type_id
- 假设您要使用自然连接命名法。
而不是transaction.cr
和transaction.dr
您应该为金额的符号建立约定,并且只有一个金额字段,根据零的哪一边被解释为贷记或借记金额已经开启。您当前的设计允许金额为信用卡和借记卡(除非您有禁止此限制的约束)。
您的设计无法容纳的一件事是“未应用的现金”。在您当前的设计中,学生的付款必须是特定的fee_student
。如果学生预付定金,获得奖学金,或只是为多项费用(学费,实验室,体育)写一张支票怎么办?在当前模型中,您不会跟踪单个(或未应用)付款。您应该有一个接受学生付款的交易表,然后使用交叉表(您当前的transaction
表)将付款应用于特定费用。这使您可以获得未付余额和未应用的金额 - 这两种金额在现实世界的应付账款申请中都很常见。
答案 1 :(得分:0)
我认为您还应该在fee_student中添加截止日期列。
如果学校有1万名学生,您将如何为所有学生添加付费信息?