我想为我拥有的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集合为基础出售我的卡的价格。

最佳答案

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

归一化也是一个抽象过程,因此归一化和数据库设计是使某人总体上变得更好的一种绝佳方法,因为归一化也是一个抽象过程。

可以说抽象是计算机编程中最困难的方面,特别是因为计算机编程要求一个人既特别是 Nerd 又要文字(为了正确地处理计算机的顽固性和愚蠢性),并且要在计算机中处理和工作。非常高级和抽象的空间。

例如,设计 session 中的参数不涉及语言语法。

这么说。我已经以较小的方式更新了架构以解决更改。

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卡具有很多详细信息(如所提到的一些颜色文字),但是对于这种模型而言,这些信息可能并不重要,因为这是为了收集和销售而跟踪实际的卡。但是,如果希望添加任何其他属性,例如牌稀有性,则可以在“牌”表中放置它们。

集合表用于集合。我不知道什么是集合,只知道这里放置的是什么(也有对系列的随意引用,我不知道它们是否相关)。集具有名称,并用于对卡进行分组。因此,我们有一个“设置”表。

卡组表是多对多联接器表。由于一个集合可以有多个卡,并且一个卡可以属于多个集合,因此模型需要一些东西来表示这种关系。这是关系数据库中非常常见的模式,但对于新手来说也不是显而易见的。

有两个简单的查找表,即condition和saletype表。这两个表在此处用于标准化目的,并允许用户针对这两种数据类别标准化其术语。它们每个都有一个“别名”和“描述”。别名是英文缩写:“Good”,“Poor”,“Auction”,“立即购买”,而说明则是较长的英文文本“Poor card显示磨损,弯曲和擦痕的迹象”。显然,出于自己目的进行此操作的人可能不需要描述,但这只是一种习惯。

最后,系统的关键是单卡表。单张纸牌表代表您手中的实际卡片。它对使每个实际卡彼此不同的所有特征进行建模。单个卡片不是集合的成员(至少不是从描述中删除),而是一个更高层次的概念(例如它的发布方式-所有“英雄:Bartek斧头Wielder”卡片都是“黑暗”的一部分谜团”和“死亡 clown ”之类的内容。因此,单个卡只需要引用其父卡表以及实际的普通卡特征即可。

该单张卡具有卡的状态以及如何通过外键将其出售到相应表的引用。它还具有其他数据,例如必需的日期和价格。

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

自己进行重塑将是一个不错的练习。从您最基本的需求和您理解的最佳模型开始。然后将其与我在此处编写的内容进行对比,然后使用该书来尝试并了解您的简单设计可能如何成为该设计。

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

关于database - 魔术: The Gathering database design,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7590552/

10-12 18:22