数组或数据库表?

时间:2010-09-07 22:49:20

标签: database database-design data-structures programming-languages

我真的可以使用一些关于最佳实践/洞察力的好反馈来确定将数据放入数据库或构建数组是否更好。比如你有套装:

$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)
}

哪种方式更好,为什么?

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 的出价。如果我们正在构建一个纸牌游戏应用程序,我们可能会将图像文件或翼形字符关联起来以表示卡片符号。

这些考虑因素都指向您的第二个设计。它是唯一一个避免重复并允许我们强制执行完整性约束的方法。