我真的可以使用一些关于最佳实践/洞察力的好反馈来确定将数据放入数据库或构建数组是否更好。比如你有套装:
$suits = array('clubs', 'spades', 'hearts', 'diamonds');
阵列可能会在未来发生变化,但如果有的话,则不会很频繁。现在这些套装适用于卡片中的卡片。因此,如果我构建一个表,那么该模式将类似于:
create table cards {
id INT(11)
card_value char(2),
suit varchar(8)
}
或者最好是构建一个suits
表并引用ID
表中的cards
,如:
create table suits {
id INT(11),
name varchar(8)
}
create table cards {
id INT(11),
suit_id int(11),
card_value char(2)
}
哪种方式更好,为什么?
答案 0 :(得分:3)
通常我会说你最好将信息存储在数据库中,尽管在卡片示例中我很想知道代码中的信息并存储一个“卡号”(suit_idx * 13) + card_value),或使用你在第二个代码片段中给出的牌表 - 因为牌很可能不会改变(特别是一旦你开始在代码中使用它们)。
在一天结束时 - 如果您要执行查询,例如卡片的“手”,或者数据库中的一副牌,然后你将要使用你的任何一种SQL表示 - 前者只是更容易查询(虽然有一个加入卡的视图西装,任何一个选项都很容易查询 - 虽然我仍然想要坚持使用第一个SQL版本。)
答案 1 :(得分:2)
在阅读了Will的回复之后,我知道Suits and Cards不是你的首选示例,但无论如何我都会追求这个例子:)
我同意西装的价值不太可能发生变化,除非你想要一个足够灵活的系统来处理塔罗牌(剑,板条,杯子和硬币)。然而,将数据保存在表格中会有好处。
首先,套装在几个地方使用。像Bridge和Whist这样的纸牌游戏需要知道哪个套装胜过。 Hearts(Black Maria,Chase the Lady)是一款游戏,需要能够区分某些带有惩罚的套装的牌。因此,有几个地方引用SUITS.ID会很有用。
第二个好处是,Suits拥有的属性多于名称。一些游戏排名适合,例如在Bridge中, Three Spades 的出价胜过 Three Hearts 的出价。如果我们正在构建一个纸牌游戏应用程序,我们可能会将图像文件或翼形字符关联起来以表示卡片符号。
这些考虑因素都指向您的第二个设计。它是唯一一个避免重复并允许我们强制执行完整性约束的方法。