创建一个包含多个值的数据库到一个键

时间:2013-12-31 20:54:52

标签: mysql database dictionary

我正在尝试创建一个包含多个值的键的数据库。

例如,键将是“benchpress”,值将是“胸部”,“三角形”,“肩部”。

我会有一堆这些键,然后想要搜索这些值并返回包含我正在搜索的内容的所有键。例如,如果我搜索胸部,我会得到具有该值的benchpress和其他练习。

我想知道这是否可行以及最好的方法是什么。我假设我必须使用MySql。

谢谢!

3 个答案:

答案 0 :(得分:1)

在MySql中执行此操作的一种方法是使用两个单独的表 - 一个用于“运动”,一个用于受影响的肌肉群。这些将由共享的“密钥”(MuscleID)加入。要向肌肉群添加新的锻炼,您只需将其添加到具有正确“MuscleID”的锻炼表中。

例如:

create table Exercise (MuscleID int, exercise varchar(50));
insert into Exercise values (1, "benchpress"),(2, "leg press");

create table Muscles (MuscleID int, muscles varchar(50));
insert into Muscles values (1, "chest"),(1, "deltoid"),(1, "shoulder"),(2, "thigh")

select *
from Exercise as E
  inner join Muscles as M on M.MuscleID = E.MuscleID
where E.exercise = "benchpress"

演示:http://sqlfiddle.com/#!2/19c9c/1

但是,这可能不是一个足够灵活的系统。对于更全面的设置,answer by @matt617很可能是更好的选择,但如果你做的很简单,这可能对你有用。

答案 1 :(得分:1)

你可能想要三张桌来做这件事。一个用于举行所有练习,一个用于保持所有肌肉,一个用于将练习与各自的肌肉相关联。然后,您可以使用JOIN语句查询第三个表以确定任何一个练习所针对的肌肉。

三个表与两个表的好处是每个运动定义和肌肉定义是独立的,因此任何运动都可以针对多个肌肉,任何肌肉都可以通过多次运动来定位。

<强>模式

exercise

id (int255) |  exerciseName (varchar255)

muscles

id (int255) |  muscleName (varchar255)

exerciseTargets

exerciseId (int255) | muscleId (int255)

<强>键

exercise.id:primary

exercise.name:唯一

muscles.id:primary

muscles.name:唯一

exerciseTargets.exerciseIdexercise.id

上的外键

exerciseTargets.muscleIdmuscle.id

上的外键

示例查询

SELECT muscleName FROM muscles INNER JOIN exerciseTargets ON exerciseTargets.muscleId = muscles.id WHERE exerciseTargets.exerciseId = :exerciseId;

(其中:exerciseId是练习的ID。)

答案 2 :(得分:0)

我建议更多地研究一下Ontology或一般的Graph Dataset。

本体正式将知识表示为域内的一组概念,使用共享词汇表示这些概念的类型,属性和相互关系。而Graph是一种更自由的关系概念(如社交网络)。所有本体实质上都是图形,但并非所有图形都是本体。

使用N3格式(这是软件本体最常见的格式)的RDF的一个非常过分的例子是:

@prefix:http://www.example.org/。 :二头肌a:肌肉。 :tricep a:肌肉。 :quadracep a:肌肉

然后你会有一个单独的RDF练习

@prefix:http://www.example.org/。 :benchpress a:运动。

然后你可以开始将它们映射到一起:

@prefix:http://www.example.org/。 :benchpress:用途:二头肌:胸肌

还有一种XML格式。有关详细信息,请访问以下网站:http://www.rdfabout.com/quickintro.xpd

事实上,如果肌肉群的RDF存在于开放领域,我不会感到惊讶,我只是对它们没有多大看法。

如果你更像是一个信息科学家类型的程序员,那么Neo4J是一个很棒的图形数据库,可以让你在没有完整本体的情况下实现图形。它使用一种非常方便的查询语言Cypher来描述关系http://www.neo4j.org/learn/cypher

我相信您可以创建一个足以满足您需求的MySQL数据库,但根据您的应用程序的长期使用将非常难以维护。