数据库设计&旅游网络应用程序的关系

时间:2014-02-11 12:00:09

标签: database database-design relational-database database-schema

我目前正在开发一个旅行和网络应用程序旅游网站。我愿意做的是允许用户注册自己以便为自己和/或家庭成员预订旅游。 “家庭成员”不需要自己注册。并且用户应该能够从预订中取消任何会员/他自己。我到目前为止设计的表格是:

users idnamepasswordemailphonelevel(区分用户和管理员), dob(出生日期), status(有效或已屏蔽)

tours idtitleshort_descstart_dateend_datemax_passenger_capacityfeespublished(布尔值), long_desc

passengers (对于未注册的其他乘客) id(PK), user_id(来自users的FK), nameagesexstatus

wallets (用户可以存款和付款) id(PK), user_id(来自用户的FK), date_timenarrationref_nowithdraw(浮动), deposit(浮动)

现在我打算创建一个invoice表(iddateuser_id等),invoice_items表(idinvoice_id等,参考谁预订了哪个旅行团,passengers_booked表(idtour_idpassenger_id等来跟踪哪位乘客选择了哪个旅游。)

用户应该能够取消巡回演出中的所有成员或巡演中的任何成员。在后一种情况下,应该提出发票,引用任何退款,其他成员应该选择参加巡回演出。

当用户为自己选择游览时,应该如何管理条件?以及如何管理这样的invoice_items以便他可以取消自己?

我完全迷失了。请帮忙。

1 个答案:

答案 0 :(得分:1)

关于usersinvoices结构的一些想法,希望能让您重回正轨。您可能需要澄清有关其他方面的问题(例如退款)。


要应对users可选passengers,您可以创建一个公共people表,people_idpassengers和{{{{}}中都是FK 1}}。希望这可以帮助您保持后续查询更简单,并简化users成为users的过程,以及可能passengers注册passengers的过程。例如:

users people(PK),idnamedob

sex users(PK),idpeople_idpasswordemail,{ {1}},phone

level status(PK),passengers(来自人群的FK),id(作为乘客)

注意:

  • people_id会更好地作为多个字段(statuspeople.name)吗?
  • 您可以将forenamesurname更好地视为email上的字段而不是phone(平衡针对潜在营销的冗余)?
  • 始终如一地使用people,而不是users(因为这需要维护)。
  • 您可能会考虑如何使dob表上的条目保持唯一,以帮助防止为同一个人添加重复项。

关于发票和退款部分,我不完全确定您发布的片段需要什么。请考虑以下事项:

age people(PK),invoiceidinvoice_dateuser_id

tour_id invoice_amount(PK),passengers_bookedid

tour_id passenger_id(PK),wallets(来自用户的FK),iduser_id,{{ 1}}(FK到发票),transaction_date_timenarration(浮动)

注意:

  • 我不确定您对invoice_no NULL的意图是什么,因为您知道谁在ref_no加入transaction_amountinvoice_detail,为谁预订。
  • 退款将通过将任何退款金额过帐到相关的invoice记录来处理。
  • 我已将passengers_bookedtour_id合并到一个wallet字段中,以便在例如计算余额时删除冗余并简化处理。可以使用+ ve和-ve值来区分类型。 [虽然您可能有会计标准要求单独的字段。]
  • 我已将withdrawal添加到deposit以跟踪与特定旅行相关的付款和退款(但可能transaction_amount存款/取款。类似地,然后可以在接收到钱包中的存款/取款时使用invoice_no。 [注:您可能考虑合并walletNULL。]

示例

  

用户U正在为自己和家人A预订旅行T,   B,C& D.他还支付了款项。让我们假设游览T的费用是   $ 1000 /乘客。所以他支付了5000美元。

ref_no表有一个用户U的记录 invoice_no表具有巡回记录T.的记录 ref_no表有5个U,A,B,C,D记录 users表有5条记录 tours表有5个巡视记录。
people表的记录日期为例如'1月1日'为5000美元的旅行T. passengers的存款记录为5000美元。 passengers_booked还支付了 - $ 5000对付我们的发票。

  

现在他希望取消B的预订。为此,他将退还(假设)   取消费用后$ 900。

B记录已从invoice移除(但可以留在wallet以备将来使用)。
wallet表格会根据修订日期进行更新,例如: '1月8日',金额4100美元 passengers_booked表格以900美元的价格退还该发票。

因此,我们使用只保留最新头寸的单一发票 您可以根据该发票的钱包条目总和检查最新发票金额,以查看是否有未付金额或应退款。

n.b。还有其他方法可以对此进行建模,例如:使用passengers作为上述摘要,但有多个invoice记录来捕获乘客变化的详细信息。取决于你为什么这样做,以及它需要多么复杂,将决定哪条路线更适合你。