sql—设计数据库并使用mysql查询—不确定是否正确建模?

gojuced7  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(760)

我是数据库设计的新手,所以我有点不确定我在这里做的事情是否正确。
我在为一个假滑板车租赁服务建立一个数据库。以下是可能影响我的数据库的事件:
如果新顾客进入商店:

  1. Store customer info,
  2. If they were referred:
  3. Make note of name of referrer

如果以前的客户输入:

  1. Retrieve previous customer info,
  2. **If this customer has an un-returned scooter, they can't borrow another

如果客户租用滑板车,请跟踪:

  1. Date/hour of borrow,
  2. Date/hour of return,
  3. How much paid,
  4. Freeform notes that are categorized, ie Issues while scooter is returned or when used

返回踏板车时:

  1. When it was returned,
  2. Is return late,
  3. Is scooter damaged,
  4. Additional fees for damage / late return

我将对数据库进行查询:
所有有旗帜的人,
所有可用的滑板车,
所有借来的摩托车,
所有迟到的摩托车,
前5名推荐最多的人,
对一个人来说,展示他借过摩托车的所有时间,
对于借款,显示任何额外费用,以及
所有摩托车制造商
下面是我想到的(还不是一个实际的图表,只是不同的表和关系),根本不确定这是否在正确的轨道上:https://imgur.com/a/nzqb0ce

dgjrabp2

dgjrabp21#

没有任何“复数”列。相反,使用另一个表链接回该表。示例:推荐、借用示例。
“前5名推荐最多的人”将更容易从上面提到的额外表格中查询。
如何判断滑板车目前是否在使用中?可能是滑板车。有空吗?请注意,当指示器“take”和“returned”时,可能需要插入/更新多个表。
“所有迟到的指示器”可能很难从建议的模式中确定。您可能需要另一个表,重点放在'销售'。也就是说,在借用踏板车时添加一行;也许事情会随着时间的推移而改变;当指示器“returned”时,行被标记为“complete”(可能没有删除)。注:此表为查看“转手”的“货币”的人提供了简单的信息。它也可能为“过去租用的滑板车”提供一个来源,我在上面批评了这一点。
因此,我建议再增加3个表,并将一些列移到这些表中。
转介。。。
不应尝试将数组放入列中。它凌乱、笨拙等。相反,创建另一个表( Referrals )把它链接回主表( Customers ).
当您有“多对1”Map(“一个”客户的“多”转介)时:

  1. Customer: customer_id MEDIUMINT UNSIGNED NOT NULL, etc
  2. -- no mention of "referrals"
  3. CREATE TABLE Referrals (
  4. customer_id MEDIUMINT UNSIGNED NOT NULL, -- the referree
  5. name, -- who referred
  6. PRIMARY KEY(customer_id, name)
  7. ) ENGINE=InnoDB

这允许许多“名称”引用一个“客户id”。
如果“推荐”必然是其他客户,那么您有一个多对多表:

  1. Customer: customer_id MEDIUMINT UNSIGNED NOT NULL, etc
  2. -- no mention of "referrals"
  3. CREATE TABLE Referrals (
  4. ee_id MEDIUMINT UNSIGNED NOT NULL, -- customer_id of the referee
  5. er_id MEDIUMINT UNSIGNED NOT NULL, -- customer_id of the referer
  6. PRIMARY KEY(ee_id, er_id),
  7. INDEX(er_id, ee_id)
  8. ) ENGINE=InnoDB
展开查看全部
wbrvyc0a

wbrvyc0a2#

正确的。你的设计有一些问题。sqldb中的思想是“规范化”信息,这意味着没有重复的数据。这是一件需要记住的事情,另一件是,你必须从“实体”和这些实体之间的“关系”来思考,而不是从对象和动作的Angular 来思考。让我们看看:

  1. CUSTOMER
  2. -name
  3. -email
  4. SCOOTER
  5. -manufacturer
  6. -model
  7. RENTALS
  8. -customerID
  9. -scooterID
  10. -startDate
  11. -plannedEndDate
  12. -actualEndDate

所以这里的“rentals”是一个多对多的表,它将一个客户与一个客户联系起来,这个客户可以租用多辆滑板车,而一辆滑板车在它的生命周期中会有很多客户。customerid和scooterid可以是mysql中的自动行id,也可以在特定的id字段中显式设置它们。
通过此设置,您可以通过设计查询获得大量信息:
有滑板车吗?

  1. SELECT * FROM RENTALS WHERE scooterID = X AND plannedEndDate > DATE()

也就是说,踏板车是租来的,将来某个时候会被归还。
我们有摩托车迟到吗?

  1. SELECT * FROM RENTALS WHERE plannedEndDate < DATE() AND actualEndDate = NULL

也就是说,应该已经归还但还没有归还的滑板车。
等等。希望有帮助!

展开查看全部

相关问题