Magic:The Gathering数据库设计

时间:2011-09-28 22:46:49

标签: database database-design

我想为我拥有的MTG卡创建一个数据库。设计是什么? 我想存储有关每张卡的以下信息:

1. Name of card.
2. Set the card belongs to.
3. Condition of card.
4. Price it sold for.
5. Price I bought it for.

以下是关于MTG卡的一些信息:

1. Every card has a name. 
2. Every card belongs to a set.
3. A card may have a foil version of itself. 
4. Card name, set it belongs to, and whether it's foil or not makes it unique. 
5. A card may be in multiple sets.
6. A set has multiple cards. 

噱头是,在我的收藏中,我可能有同一张卡的几个副本,但条件不同,或购买价格,或售价可能不同。

我将在eBay上销售另一套mtg卡。此集合将具有价格/条件/日期/是否为“立即购买”或出价等。

我的想法是找出我应该根据eBay系列卖出我的卡的价格。

3 个答案:

答案 0 :(得分:17)

这不是一个编程问题,它是一个建模问题。编程但不是建模的任何人都是编码员,而不是程序员。这只是数据输入的一步。建模是编程的一个基本方面,因为它直接处理抽象,而抽象是计算机编程的真正天才。

规范化和数据库设计是一种很好的方式,可以让人们在编程方面变得更好,因为规范化也是一个抽象过程。

抽象可以说是计算机编程中最困难的方面,特别是因为计算机编程需要一个人特别迂腐和文字(为了正确地处理作为计算机的坚定的顽固和愚蠢)以及处理和在非常高的层次和抽象的空间工作。

例如,设计会议中的参数不是语言语法。

所以,那就是说。我已经以较小的方式更新了架构以解决这些变化。

create table card (
    card_key numeric not null primary key,
    name varchar(256) not null,
    foil varchar(1) not null); -- "Y" if it's foil, "N" if it is not.

create table set (
    set_key numeric not null primary key,
    name varchar(256) not null);

create table cardset (
    card_key numeric not null references card(card_key),
    set_key numeric not null references set(set_key));

create table condition (
    condition_key numeric not null primary key,
    alias varchar(64),
    description varchar(256));

create table saletype (
    saletype_key numeric not null primary key,
    alias varchar(64),
    description varchar(256));

create table singlecard (
    singlecard_key numeric not null primary key,
    card_key numeric not null references card(card_key),
    condition_key numeric not  null references condition(condition_key),
    purchase_date date,
    purchase_price numeric,
    saletype_key numeric references saletype(saletype_key),
    sell_date date,
    sell_price numeric,
    notes varchar(4000));

更详细的解释。

卡表是卡与实际卡的概念。您可以在没有任何实际卡片的情况下拥有卡片行。它模拟了所有卡片共有的卡片细节。很明显,MTG卡有很多细节(有人提到的彩色文字),但这些对这种模型来说可能并不重要,因为这是为了收集和销售而追踪实际卡片。但是,如果有任何其他属性的愿望,比如卡稀有,那就是“卡片”。桌子就是摆放它们的地方。

集合表用于集合。我不知道集合是什么,只知道这里假设的内容(还有一个系列的随意引用,我不知道它们是否相关)。集具有名称,用于分组卡。所以,我们有一套'表

卡组表是多对多连接表。由于一个集合可以有多张卡片,并且一张卡片可以属于多个集合,因此该模型需要一些东西来表示这种关系。这是关系数据库中非常常见的模式,但对初学者来说也是不明显的。

有两个简单的查找表,条件和saletype表。这两个表用于标准化目的,让用户标准化这两类数据的术语。他们每个人都有一个别名'以及'描述'别名是简短的英文版本:' Good','差评'拍卖','现在购买',而描述是较长的英文文本和可怜的卡片显示出磨损,弯曲和擦痕的迹象。显然,为了自己的目的而这样做的人可能不需要描述,但它就是习惯。

最后,系统的核心是单个表。单张表代表一张实际的,在您的手牌中。它模拟了使每张实际卡彼此不同的所有特征。个人卡不是一个集合的成员(至少不是描述中的成员),而是更高级别的概念(例如它是如何发布的 - 所有" Hero:Bartek the Axe Wielder&#34 ;卡片是“黑暗之谜”中的一部分""死亡小丑"套装等等。因此,单卡只需参考其父卡表,具有实际的通用卡特征。

此单张卡可以参考卡的状况以及如何通过外键将其销售到相应的表格中。它还有其他数据,例如必要的日期和价格。

根据给出的内容,这应该满足基本需求。

自己重塑这个是一个很好的练习。从您最基本的需求开始,以及您理解的最佳模型。然后将它与我在这里写的内容进行对比,然后使用那本书来尝试理解你的简单设计是如何成为这种设计的。

请注意,无法实际强制执行任何卡的成员,或者某个卡有任何卡。这将是一个应用程序逻辑问题。这是多对多连接表的这个问题之一。它可以对关系进行建模,但不能强制执行。

答案 1 :(得分:1)

好吧,这不是一个真正的编程问题;它是非常高级的,你没有说明你将使用什么数据库以及你尝试过什么。

但是,只是为了给您几点,第一个列表(在您的问题中)几乎肯定代表了您需要存储在数据库中的大部分信息。

您需要弄清楚的是,这些字段的哪些组合可以用来唯一地标记一张卡片。

如果您说,购买日期和成本可能会因您选择的数据库而异,则需要根据这些字段制作索引;这将使您能够存储同一张卡的多个实例。

我会阅读'关系数据库'。如果你真的迷路了,我建议你拿一份'SQL for dummies',SQL是大多数数据库提供商使用的语言,它有逐步的说明和教程来构建你自己的数据库'。

答案 2 :(得分:0)

我建议您查看www.mtgjson.com的数据文件

通过查看他们选择的字段类型并阅读评论和文档,您可能会避免许多警告。

例如,您将看到它们如何处理重复的名称,相互关联的卡片,例如翻转或旋转的卡片,或者将另一个的版本融合在一起,以及更多的细微差别。