0

我真的可以在最佳做法/洞察力方面使用一些很好的反馈意见,以便将事情放入数据库还是构建数组。举个例子,你有卡的套装:数组或数据库表?

$suits = array('clubs', 'spades', 'hearts', 'diamonds'); 

该阵列可以改变未来,但不是很频繁,如果在所有。现在这些套装适用于套牌中的牌。所以,如果我建一个表,该模式将类似于:

create table cards { 
    id INT(11) 
    card_value char(2), 
    suit varchar(8) 
} 

还是更在cards表像建一个suits表并引用ID

create table suits { 
    id INT(11), 
    name varchar(8) 
} 

create table cards { 
    id INT(11), 
    suit_id int(11), 
    card_value char(2) 
} 

是哪个更好的方式去,为什么?

回答

2

看了您的评论威尔的反应,我知道西装和卡是不是你的例子的第一选择,但我无论如何要去追求的例子:)

我同意这是不可能的西服值将会改变,除非你想要一个足够灵活的系统来处理塔罗牌(剑,法杖,杯和硬币)。尽管如此,将数据保存在表中还是有好处的。

第一个是西装在几个地方使用。像Bridge和Whist这样的纸牌游戏需要知道哪个套牌是王牌。心(黑玛丽亚,追逐夫人)是一个游戏,需要能够区分某些诉讼的卡片进行处罚。所以,有几个地方引用SUITS.ID会很有用。

第二个好处是套装有更多的属性,而不仅仅是名称。一些游戏排名适合,例如在桥牌出价三个黑桃中标赢得三颗心。如果我们正在构建一个纸牌游戏应用程序,我们可能会关联一个图像文件或有翼人物来表示卡片符号。

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

+0

这有助于很多!这有助于我看到,虽然阵列可以工作,但这不仅仅是眼前的需求。为了获得更好的可扩展性,最好将数据放在数据库中(不管多小),因为它很可能会在应用程序的其他地方使用。最好从数据库访问它,而不是硬编码的地方。感谢您打开我的心! – 2010-09-08 13:23:46

3

通常我会说你最好将信息存储在数据库中,尽管在卡片示例中,我会试着让代码中的信息存储并且存储从(suit_idx * 13 + card_value),或者使用你在第二个代码片段中给出的卡片表 - 因为卡片不太可能改变(特别是一旦你开始在代码中使用它们)。

在一天结束时 - 如果您打算针对例如'卡',或者针对数据库中的一副卡片,那么你会想要使用你的SQL表示 - 前者只是更容易查询(尽管有一个视图将卡片连接到适合任何一个选项都很容易查询 - 尽管我仍然试图坚持第一个SQL版本)。

+0

是的,我想不出一个更好的例子。这更多的是关于西装而不是数字。但是,这不是它通常如何运作。我应该坚持原来的汽车色彩理念。卫生署! – 2010-09-07 23:08:50

+0

颜色到你肯定会存储在数据库中的汽车 - 你可能会一直在找新汽车 - 而且他们总是能够梦想着新的颜色 - 所以你的第二个SQL代表 - 规范化 - 就是一个去这里。 :) – 2010-09-07 23:10:46

+1

这不是一个正常化问题。在第一个表中,没有任何功能上依赖于“诉讼”栏。如果第一个表有另一个称为“colour”的列,那么它不会被标准化。 – 2010-09-07 23:24:43