如何建模复杂数据

时间:2010-10-16 02:20:28

标签: sql database-design data-modeling

我必须创建一个模型,在几个平台上存储游戏的游戏控制。我无法找到正确的方法。

  1. 不同系统上的控制器按钮不同(Wii,Xbox 360,PS3都有自己特定的控制器按钮。)
  2. 有些游戏实际上是几个游戏打包成一个游戏;这意味着单个产品可以根据正在播放的游戏进行多项控制。
  3. 许多游戏的游戏控制根据您的游戏内活动(驾驶/步行/飞行等等)而变化。
  4. 仅存储按钮功能是不够的,因为大多数游戏都有几个需要组合按钮的特殊动作。
  5. 你会如何解决这个问题?老实说,我不知道从哪里开始!

    更新:非常感谢大家的深思熟虑,非常有帮助的意见。我还没有选择和回答,因为最终决定这个功能不值得付出努力。非常感谢。

7 个答案:

答案 0 :(得分:2)

某些控制器共享公共布局但具有不同的面,即360和PS3(X是A,三角形是Y等)。有额外的外围设备,如战斗棒,飞行棒,吉他等 - 它们只是映射到控制台预期的不同面孔。由于按钮通常是在任何控制器均匀成型之前定义的,因此您也可以这样做。

每个映射都不会全部适用于每个控制器,所以它可能并不理想 - 考虑到现代控制台控制器,它应该没问题。如果你添加Intellivision控制器和键盘/鼠标,事情可能会开始变得奇怪。

// using CHAR(8) for absolutely no good reason. change at will.
CREATE TABLE button_maps (
id tinyint unsigned not null auto_increment,
map_id char(8) not null,
primary key (id),
unique key map_id (map_id)
);

INSERT INTO button_maps (map_id)
VALUES
// dual analog, any direction
('ANA_LFT'), ('ANA_RT'),
// 4-button compass face
('BT_N'), ('BT_S'), ('BT_E'), ('BT_W'),
// shoulder buttons
('BT_LT1'), ('BT_LT2'), ('BT_RT1'), ('BT_RT2'),
// system buttons
('BT_START'), ('BT_SEL'), ('BT_MENU'),
// analog stick click-in, usually called "L/R 3"
('ANA_L3'), ('ANA_R3'),
// 8-direction d-pad - add clockface points for both analogs too
('DPAD_N'), ('DPAD_S'), ('DPAD_E'), ('DPAD_W'),
('DPAD_NW'), ('DPAD_NE'), ('DPAD_SW'), ('DPAD_SE'),
// and DS stylus so it's not obvious what I'm looking at right now
('STL_TAP'), ('STL_DTAP'), ('STL_DRAG'),
// and so on

注意:我不知道如何在内部处理这些全身运动控制的事情,如果你不得不处理它们,那就好运。 LFOOT_HOKEYPOKEY或其他。

注2:说真的,不要在那里使用char(8)。详细说明,但要保持足够通用,以适用于通用控制器样式而不是品牌。

现在每个品牌控制器的按钮及其名称(假定为“控制器”表):

CREATE TABLE buttons (
id tinyint unsigned not null auto_increment,
controller_id tinyint unsigned not null references controllers.id,
map_id tinyint unsigned not null references button_maps.id,
button_name varchar(32) not null,
primary key (id),
unique key controller_map (controller_id, map_id)
);

INSERT INTO buttons (controller_id, map_id, button_name)
VALUES
(2, 1, 'Left Analog'), (2, 2, 'Right Analog'),
(2, 3, 'Y'), (2, 4, 'A'), (2, 5, 'B'), (2, 6, 'X'),
(2, 7, 'Left Trigger (LT)'), (2, 8, 'Right Trigger (RT)'),
(2, 9, 'Left Bumper (LB)'), (2, 10, 'Right Bumper (RB)')
// and so on.  PS3 with button shapes and R1/2, L1/2 instead of trigger/bumper

现在,对于操作,按下按钮(或多个按钮或序列)代表游戏。这不考虑上下文(原始问题的2和3),例如,游戏模式或备用按钮配置,但Josh Smeaton和littlegreen已经涵盖了这一点。

这定义了每个游戏的动作,效率不高。您可以通过添加通用的游戏“类型”层来显着缩减事物。某些类型/视角内的许多游戏都有共同的控制,并且它变得越来越普遍(控制台FPS添加预定义的Halo和CoD风格的按钮配置,因为玩家知道它们等等)。因此,如果您可以为每个类型定义一组常用操作,并仅使用它来根据需要覆盖/扩展这些默认值,那么您可以实现更清晰的解决方案。

首先,定义每个动作:

CREATE TABLE game_actions (
id int unsigned not null auto_increment,
game_id int unsigned not null references games.id,
action varchar(32) not null,
primary key (id)
);

INSERT INTO game_actions (game_id, action)
VALUES (1, 'Shoot'), (1, 'Reload'), (1, 'Turn Left'), (1, 'Turn Right')
// and so on

最后,定义与每个动作关联的按钮按下。 “序数”字段用于组合序列,例如格斗游戏组合 - 单个动作是第0个序数,序列从1开始计数,只是为了使它们易于区分。它不考虑时间,所以你可能需要一个“无”按钮作为一些更复杂的组合游戏的休息(Soul Caliber等人)。

CREATE TABLE game_action_buttons (
id int unsigned not null auto_increment,
game_action_id int unsigned not null references game_actions.id,
ordinal tinyint unsigned not null,
button_map_id tinyint unsigned not null references button_maps.id,
primary key (id)
);

INSERT INTO game_action_buttons (game_action_id, ordinal, button_map_id)
VALUES
(1, 0, 8), // right trigger to shoot
(2, 0, 6), // west face button (X/square) to reload
(3, 0, 7), (3, 0, 9) // combo: both bumpers for rear view look-back while driving
// and a Street Fighter shoryuken on the d-pad to show a sequence:
(4, 1, 21), // DPAD_E: right
(4, 2, 20), // DPAD_S: down
(4, 3, 26), (4, 3, 4) // DPAD_SE + BT_S: down/right + fierce... i think.

(免责声明:我为我工作过的游戏工作室创建了一个类似的数据库。不完全相同,但足够相似,我有点故意留下了很多。抱歉!希望这足以启动一些想法,这是一个有趣的问题。)

答案 1 :(得分:1)

您可以为初学者(编辑:第二次尝试)

尝试此操作
Game
----------
(PK) GameID integer
GameTitle varchar(100)

Controller
----------
(PK) ControllerID integer
ControllerDescription varchar(100)
(FK) GameID integer

Effect
----------
(PK) EffectID integer
EffectDescription varchar(100)
(FK) ControllerID integer

Buttons
----------
(PK) ButtonID integer
ButtonKey varchar(25)
(FK) EffectID integer

例如:

GameID  GameTitle
----------------------------------------------
1       Super Mario Bros.

ControllerID ControllerDescription GameID
----------------------------------------------
1            Main Controller       1

EffectID EffectDescription ControllerID
----------------------------------------------
1        Run               1
2        Jump              1
3        Pause             1
4        Move Left         1
5        Move Right        1

ButtonID ButtonKey      EffectID
----------------------------------------------
1        B              1
2        Direction Pad  1
3        A              2
4        Start          3
5        Left Pad       4
6        Right Pad      5

答案 2 :(得分:1)

我会给它一个旋转:)


    controller [table] 
// list of controllers - Wii Mote etc.
    controller_id (int, PK) | title (varchar)

    game_buttons [table] 
// list of buttons on a controller A/B/X/Y/...
    button_id (int, PK) | title (varchar) | controller_id (int, FK)

    game [table] 
// game details - you could, if you want, differentiate the games by console here as well as they may have different titles even though they are similar in nature
    game_id (int, PK) | title (varchar)

    controls [table] 
// this is the main table that will combine the buttons with the games. combo_id is a foreign key to the control_combo table. So if you have a sequence of keys that calls for buttons A and then B, you would call in the same number for combo_id and ord table will tell us in what order they should be placed. If they're not part of a combo, you can leave the default combo_id to 0.

    game_id (int, PK) | button_id (int, FK) | title (varchar) | description (text) | combo_id (int) | ord

    control_combo [table]
// control_combo - the master table for button combos
    combo_id (int, PK) | title (varchar) | ord (tinyint)

答案 3 :(得分:1)

这个怎么样:

/* PRODUCTS: Each product has one title and runs on one gamesystem */
(PK) ProductID int
ProductTitle varchar(100)
(FK) GameSystemID int

/* GAMES: Each game has one title and belongs to one product */
(PK) GameID int
GameTitle varchar(100)
(FK) ProductID int

/* GAMESYSTEMS: Each gamesystem has one name */
(PK) GameSystemID int
GameSystemName varchar(100)

/* GAMEACTIVITIES: Each game has one or more activities (flying, running, ..) */
(PK) GameActivityID int
(FK) GameID int
GameActivityDescription VARCHAR(100)

/* BUTTONS: Each gamesystem has certain buttons with names */
(PK) ButtonID int
(FK) GameSystemID int
ButtonName VARCHAR(100)

/* GAMEACTIONS: Each game activity provides certain game actions (fly left, fly right, ..) */
(PK) ActionID int
(FK) GameActivityID int
ActionDescription VARCHAR(100)

/* BUTTONCOMBINATIONS: Each game action is associated with a certain button or combination of buttons */
(FK) ActionID int
(FK) ButtonID int

答案 4 :(得分:1)


Console
    int id
    string name

Controller
    int id
    string name
    int console_id fk

Button
    int id
    string name
    int controller_id fk

Game
    int id 
    string name
    int parent_id fk -- game within a game

-- context within a game (default, driving, swimming)
Context
    int id
    string name
    int game_id fk

-- applicable actions within a context of a game
Action
    int id
    string name
    id context_id int

-- a set of buttons that map to an action, whether it is one button or multiple
Combination
    int id
    int action_id fk
    int button_id fk

使用上述结构的一个例子:

控制台:PS3 游戏:MAG ...

当前比赛状态:
    背景:驾驶     允许的动作:方向(前进,左转等),制动,冒烟     允许的组合:每个操作的每个组合的列表

按下一系列按钮时,例如:L1 + DirectionRight,在允许的组合中查找该组合,找到相关操作,然后执行该操作。

答案 5 :(得分:1)

我只是简单地想一想,但我认为你可以使用这样的东西(我懒得添加ER'叉子但是顶级表格参考底部表格):

data model

  • 按钮 - 是控制器上的一个按钮,我假设你需要用类型来识别它们,这样你就可以识别按压,方向,压力等等......
  • consle - 存储wii,xbox,...
  • 游戏玩法 - 是你的级别,每个级别都有多个动作(或者你喜欢的动作)这些动作应该最终执行一段代码,以便在这个游戏中发生一些事情水平。
  • console-move - 是在特定控制台上执行特定移动的按钮组合。如果您需要在wii中而不是在xbox上按下按钮组合,那么应该可以

您可以选择将按钮链接到控制台

答案 6 :(得分:1)

我会试一试:)

1)你需要一个系统表

2)你需要一个包的表(有一个可以为父的可空引用),一个带游戏的表和一个用游戏包连接游戏的表。这确保了游戏可以成为不同包的一部分。但是,它不允许不同的包装具有相同游戏的不同“特殊转换”。但这不是一个要求:)

3)我不确定这是否与2)相同,如果不是:一个参考游戏的表格,如果:见2)

4)你需要一个表格来表示一个动作(“序列”),并引用一个游戏部分,然后你需要一个表格用于一个键组合,并引用一个序列。最后,您需要一个特定键的表,并引用一个组合。

我认为这将涵盖它,虽然我对操纵杆,鼠标等有关注。你可能想把“关键”-table拆分成几个表以避免该表中的许多列,但这是你的决定取决于您计划如何访问您的数据库等。