Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 什么';在数据库中存储一副卡片的最佳方式是什么?_Sql_Database_Data Representation - Fatal编程技术网

Sql 什么';在数据库中存储一副卡片的最佳方式是什么?

Sql 什么';在数据库中存储一副卡片的最佳方式是什么?,sql,database,data-representation,Sql,Database,Data Representation,我正在开发一个应用程序,它需要在数据库中存储一副手牌。我不确定在数据库中表示这一点的最佳方式是什么 套牌将由申请者预先发给4手牌,每人持有13张牌。之后,我需要存储的手和额外的数据,如西装分布等 是否最好为每只手创建一个单独的行,并将其与牌组关联?或者最好把它们排成一行 我也不确定我是否应该把它们作为文本或数字保存。 下面是一个例子: Sorted by suit and separated by dot AK.32.6543.AKQ98 或 有什么想法吗 附言:储存这些卡片是有原因的。我们需

我正在开发一个应用程序,它需要在数据库中存储一副手牌。我不确定在数据库中表示这一点的最佳方式是什么

套牌将由申请者预先发给4手牌,每人持有13张牌。之后,我需要存储的手和额外的数据,如西装分布等

是否最好为每只手创建一个单独的行,并将其与牌组关联?或者最好把它们排成一行

我也不确定我是否应该把它们作为文本或数字保存。 下面是一个例子:

Sorted by suit and separated by dot
AK.32.6543.AKQ98

有什么想法吗


附言:储存这些卡片是有原因的。我们需要分析手牌分布、高牌点数等。

这取决于您要进行的分析类型。如果是我,我可能会默认为(忽略非主要约束)

每个
HAND
HAND\u元素中有13行。我不会费心存储关于衣服分布的信息,我只会计算手的分布,即

SELECT suit, count(*)
  FROM hand JOIN hand_element USING (hand_id)
            JOIN card         USING (card_id)
 WHERE hand_id = :some_hand_id

这取决于你想做什么样的分析。如果是我,我可能会默认为(忽略非主要约束)

每个
HAND
HAND\u元素中有13行。我不会费心存储关于衣服分布的信息,我只会计算手的分布,即

SELECT suit, count(*)
  FROM hand JOIN hand_element USING (hand_id)
            JOIN card         USING (card_id)
 WHERE hand_id = :some_hand_id

我认为最自然的做法是创建一张牌表,牌组中的每一张牌都有一条记录,然后是手牌记录,手牌中的每一张牌都有一条记录。如果有关于整只手的数据——玩家的名字?他坐在桌边的什么地方?他有多少筹码?不管怎样,那么你需要一张单独的桌子来放手牌,而不是手上的牌。我还将为西装创建一个查找表

(我们可以在这里讨论合成键和自然键的使用,但这是另一个主题。)

我的第一个冲动是将“rank”设置为1到13之间的数字,并在输出时将1转换为“Ace”,将11到13转换为“Jack”、“Queen”和“King”。您可以将它们存储为文本,但如果需要,则很难比较等级。i、 e.决定13>10对数据库是否容易;国王>10,不多

我绝对不会试图将多张卡片的标识塞进一个字段中,无论是用句点分隔还是用固定长度ID分隔还是其他什么分隔。要做到这一点,您的程序需要有代码将此字段拆分以获取所需的数据,而不仅仅是让数据库检索所需的数据,这正是数据库的用途

我不知道你想用这些牌手做什么,但是你可能想做的大多数事情都很简单,就像我描述的那样,如果你把一张牌的列表塞进一个字段中,那就相当困难了。比如,“谁有黑桃王?”很简单:

或者,“每个玩家有多少张脸牌?”

当然,“玩家3有什么牌?”也很简单:

select rank, suitname
from handcard
join card using (cardid)
join suit using (suitid)
where handid=3

使用压缩格式执行这些查询需要复杂的字符串提取调用。而且字符串操作总是一件痛苦的事情。就像你经常遇到的问题一样,如果我在文本中搜索2,如何排除'12'中的2's?等等。

我认为最自然的事情是为牌创建一个表,其中牌组中的每一张牌都有一条记录,然后手部的记录,手部的每一张牌都有一条记录。如果有关于整只手的数据——玩家的名字?他坐在桌边的什么地方?他有多少筹码?不管怎样,那么你需要一张单独的桌子来放手牌,而不是手上的牌。我还将为西装创建一个查找表

(我们可以在这里讨论合成键和自然键的使用,但这是另一个主题。)

我的第一个冲动是将“rank”设置为1到13之间的数字,并在输出时将1转换为“Ace”,将11到13转换为“Jack”、“Queen”和“King”。您可以将它们存储为文本,但如果需要,则很难比较等级。i、 e.决定13>10对数据库是否容易;国王>10,不多

我绝对不会试图将多张卡片的标识塞进一个字段中,无论是用句点分隔还是用固定长度ID分隔还是其他什么分隔。要做到这一点,您的程序需要有代码将此字段拆分以获取所需的数据,而不仅仅是让数据库检索所需的数据,这正是数据库的用途

我不知道你想用这些牌手做什么,但是你可能想做的大多数事情都很简单,就像我描述的那样,如果你把一张牌的列表塞进一个字段中,那就相当困难了。比如,“谁有黑桃王?”很简单:

或者,“每个玩家有多少张脸牌?”

当然,“玩家3有什么牌?”也很简单:

select rank, suitname
from handcard
join card using (cardid)
join suit using (suitid)
where handid=3

使用压缩格式执行这些查询需要复杂的字符串提取调用。而且字符串操作总是一件痛苦的事情。就像你经常遇到的问题一样,如果我在文本中搜索2,如何排除'12'中的2's?等等。

我也在为3张扑克牌做一个类似的项目。我的SQL设置如下:

CREATE TABLE cards 
(

    id int AUTO_INCREMENT,
    suite varchar(30) NOT NULL,
    rank int NOT NULL,
    dealt BOOLEAN DEFAULT false,
    PRIMARY KEY (id)

);
然后运行命令以以下方式填充数据库:

INSERT INTO cards (suite,rank) VALUES ('spades',1);

通过这种方式,你可以在数据库中循环,并在发牌时将“发牌”更改为“真”。还可以方便地比较等级。

我也在从事一个类似的3卡扑克项目。我的SQL设置如下:

CREATE TABLE cards 
(

    id int AUTO_INCREMENT,
    suite varchar(30) NOT NULL,
    rank int NOT NULL,
    dealt BOOLEAN DEFAULT false,
    PRIMARY KEY (id)

);
然后运行命令以以下方式填充数据库:

INSERT INTO cards (suite,rank) VALUES ('spades',1);
通过这种方式,你可以在数据库中循环,并在发牌时将“发牌”更改为“真”。还可以方便地比较等级。

定义“最佳”。你的意思是“用最少的字节存储一只手的最佳方式”,还是,
INSERT INTO cards (suite,rank) VALUES ('spades',1);