mysql 是否值得拥有一个只引用父表中列的表

xu3bshqb  于 2022-11-21  发布在  Mysql
关注(0)|答案(1)|浏览(137)

我目前有一个交易卡的数据库,主表是AllCards。这个表有20列,有上百万行,但我的问题是关于列布尔类型isSold in AllCards。每当用户加载我们的站点时,就会执行类似“select someColumns from AllCards where isSold = False”的查询来显示所有可用的卡。然而,我想知道是否有一个标记为historical和current的单独的表以避免查询数百万行会更好。我的后端代码将把尚未售出的卡放置到Current,在“当前”中删除该行并将该行移至“历史”。

Table Historic
Uid INT,
HCardID INT,
FOREIGN KEY Uid REFERENCES User(id),
FOREIGN KEY HCardID REFERENCES AllCards(cardID)

Table Current
Uid INT,
CCardID INT,
FOREIGN KEY Uid REFERENCES User(id),
FOREIGN KEY CCardID REFERENCES AllCards(cardID)

如上所示,Historic包含已售出的AllCards的ID,Current包含尚未售出的AllCards的ID。因此,当用户加载我们的站点时,我只需对表Current执行连接查询,并迭代表AllCards,其中CardID = CCardID,而不必查询表AllEvents的所有行并检查它是否已售出。对于性能和组织来说,这是一种有效的方法吗?还是应该忘记它,只使用AllCards表并使用isSold列?在同一主题中,我还实现了表Week,一个表,其中包含本周从某个用户那里购买的所有卡片。对于这个表,我还采用了

Table Week
Uid INT,
WCardID INT,
FOREIGN KEY Uid REFERENCES User(id),
FOREIGN KEY WCardID REFERENCES AllCards(cardID)

这样,我就不必查询数百万行来查找用户本周购买的卡,而是可以从Table Week和AllCards执行联接,其中cardID = WCardID,Uid = Uid。这是否有助于提高性能和组织性?这种方法是否值得?或者,我是否应该遍历AllCards中的行并执行查询,以获取用户本周购买的卡的相同数据?

dluptydi

dluptydi1#

周数据表不应该存在。请改为在AllCards中建立日期时间并编制索引。
在Current和AllCards之间来回移动可能比简单地扫描整个AllCards要慢。对History也是如此。无论如何,两者都相当于在大表上有一对索引。我假设在AllCards中有某个列区分“当前”实体和“历史”条目。
如果同一张“卡”在每次交易时再次出现,则可能需要一个Cards表(具有与“卡”相关的列)和一个Trades表(具有与交易相关的列)。交易可能具有UId和CCardId列以及TradeDate,但Cards没有。TradeDate肯定会被索引,因此可以有效地获得一周的交易。

相关问题