Php 两种方法间病床收费数据库的优化设计

Php 两种方法间病床收费数据库的优化设计,php,mysql,Php,Mysql,我正在尝试创建一个医院床位收费数据库。对于哪种方法更好,我有点困惑 哪种方式更容易维护和查询数据库 我个人认为第一种方法更好 方法1 room_no charges_cash charges_cashless MG1 300 400 MG2 400 500 方法2 room_no charges cash_cashless MG1 300 cash MG1 400 cas

我正在尝试创建一个医院床位收费数据库。对于哪种方法更好,我有点困惑

哪种方式更容易维护和查询数据库

我个人认为第一种方法更好

方法1

room_no charges_cash    charges_cashless
MG1      300                400
MG2      400                500
方法2

room_no charges  cash_cashless
MG1      300     cash
MG1      400     cashless
MG2      400     cash
MG2      500     cashless

先谢谢你

第一个。这样,您就可以使用
房间号
作为主键。第二个是好的,当它不是主数据时,当它是一个关系表时。这取决于您的数据库设计。

使用方法2的原因是,如果您设计的数据库是根据需求进行扩展的

第一个将更易于查询,但第二个将允许您向cash\u cashless列添加其他值,尽管您可以将其重命名为更通用的名称以处理不同的类型


在这种情况下,您的要求可能仅限于这两种现金和无现金,但出于上述原因,通常使用第二种方法。

我将在一个字段中使用价格,在另一个字段中使用现金,以避免在您为一次付款创建两行时重复其他字段的数据。

简言之,我将使用选项二

从关系数据库设计的角度来看,我同意Flosculus的观点,好像你想在将来增加额外类型的费用(例如,将无现金分成信用卡、Paypal、Worldpay等),那么在选项一中,你需要改变模式,但在选项二中你不需要;只需在cash\u cashless中使用不同的值(也许可以将该列重命名为“payment\u type”或其他什么?)

例如:

房间表

Room_No  Room_Name   Other_Columns
MG1      Room One          *
MG2      Room Two          *
费用表

Charge_ID Room_no Charge  Payment_Type
1         MG1      300     cash
2         MG1      400     cashless
3         MG2      400     cash
4         MG2      500     cashless  
5         MG2      450     cheque
6         MG2      600     creditcard 
另外,从性能的角度来看,您可能会发现选项二随着时间的推移,它的伸缩性更好,因为您可以在查询中更细粒度,并且它允许您创建更高效的索引


如果您只想为每个房间提供一种类型的费用,您可以使用[room_no]和[Payment_type]列中的复合主键。

我个人推荐方法1,因为它需要更少的行数,并且更容易在room_no上执行联接,这取决于您的数据模型。“现金”和“无现金”是否始终是必需的数据点,必须始终附加到一行?那么,将其设置为列是一件合乎逻辑的事情。否则,如果房间与这些费用之间的关系更为动态,那么用另一种方式来处理可能是有意义的。呃。有人对医院预约收费吗?