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

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

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

Store customer info,

If they were referred:

    Make note of name of referrer

如果以前的客户输入:

Retrieve previous customer info,

**If this customer has an un-returned scooter, they can't borrow another

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

Date/hour of borrow,

Date/hour of return,

How much paid, 

Freeform notes that are categorized, ie Issues while scooter is returned or when used

返回踏板车时:

When it was returned,

Is return late, 

Is scooter damaged, 

Additional fees for damage / late return

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

dgjrabp2

dgjrabp21#

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

Customer:  customer_id MEDIUMINT UNSIGNED NOT NULL, etc
    -- no mention of "referrals"
CREATE TABLE Referrals (
    customer_id MEDIUMINT UNSIGNED NOT NULL,  -- the referree
    name,   -- who referred
    PRIMARY KEY(customer_id, name)
) ENGINE=InnoDB

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

Customer:  customer_id MEDIUMINT UNSIGNED NOT NULL, etc
    -- no mention of "referrals"
CREATE TABLE Referrals (
    ee_id MEDIUMINT UNSIGNED NOT NULL,  -- customer_id of the referee
    er_id MEDIUMINT UNSIGNED NOT NULL,  -- customer_id of the referer
    PRIMARY KEY(ee_id, er_id),
    INDEX(er_id, ee_id)
) ENGINE=InnoDB
wbrvyc0a

wbrvyc0a2#

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

CUSTOMER
 -name
 -email

SCOOTER
 -manufacturer
 -model

RENTALS
 -customerID
 -scooterID
 -startDate
 -plannedEndDate
 -actualEndDate

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

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

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

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

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

相关问题