我想发送类似于此的JSON响应:
{
{"key":"Value"},
{"key":"Value"}
"title":['john','doe'],
"abcd":[
{"key":"Value"},{"key":"Value"},{"key":"Value"}]
}
我怎样才能拥有我的mysql表结构?
答案 0 :(得分:0)
您最好将密钥值存储系统用于此类目的,但存在大量耗时的解决方案。
我使用DataMapper
创建了下面的数据库表。它与实现一样快,如果您决定使用此方案,则应考虑添加一些约束。我试图让事情变得简单,这种灵感来自于redis
。
我有6张桌子。其中2个存储相关表的主键。
Table: roots
Create Table: CREATE TABLE `roots` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
Table: titles
Create Table: CREATE TABLE `titles` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
Table: features
Create Table: CREATE TABLE `features` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_features_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
Table: rootfeatures
Create Table: CREATE TABLE `rootfeatures` (
`root_id` int(10) unsigned NOT NULL,
`feature_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`root_id`,`feature_id`),
KEY `index_rootfeatures_root` (`root_id`),
KEY `index_rootfeatures_feature` (`feature_id`),
CONSTRAINT `rootfeatures_feature_fk` FOREIGN KEY (`feature_id`) REFERENCES `features` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `rootfeatures_root_fk` FOREIGN KEY (`root_id`) REFERENCES `roots` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
Table: roottitles
Create Table: CREATE TABLE `roottitles` (
`root_id` int(10) unsigned NOT NULL,
`title_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`root_id`,`title_id`),
KEY `index_roottitles_root` (`root_id`),
KEY `index_roottitles_title` (`title_id`),
CONSTRAINT `roottitles_title_fk` FOREIGN KEY (`title_id`) REFERENCES `titles` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `roottitles_root_fk` FOREIGN KEY (`root_id`) REFERENCES `roots` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
Table: details
Create Table: CREATE TABLE `details` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(50) DEFAULT NULL,
`feature_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `index_details_feature` (`feature_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
<强> models.rb 强>
class Root
include DataMapper::Resource
property :id, Serial
property :name, String
has n, :roottitles
has n, :titles, :through => :roottitles
has n, :rootfeatures
has n, :features, :through => :rootfeatures
def list_of_titles
arr = []
self.titles.each {|t| arr<< t.name}
arr
end
def list_of_features
arr = []
self.features.each {|t| arr<< t.name }
arr
end
def list_of_features_with_details
arr = []
self.features.each {|t| arr<< {t.name => t.detail.title} unless t.detail.nil?}
arr
end
def full_description
h = {'titles' => self.list_of_titles, 'features' => self.list_of_features_with_details}
h
end
def full_json
self.full_description.to_json
end
end
class Title
include DataMapper::Resource
property :id, Serial
property :name, String
has n, :roottitles
has n, :roots, :through => :roottitles
end
class Feature
include DataMapper::Resource
property :id, Serial
property :name, String, :unique => true
has n, :rootfeatures
has n, :roots, :through => :rootfeatures
has 1, :detail
end
class Roottitle
include DataMapper::Resource
belongs_to :root, :key => true
belongs_to :title, :key => true
end
class Rootfeature
include DataMapper::Resource
belongs_to :root, :key => true
belongs_to :feature, :key => true
end
class Detail
include DataMapper::Resource
property :id, Serial
property :title, String
belongs_to :feature
end
功能数据
2.2.0 :006 > Feature.each {|t| print "#{t.id} #{t.name} \n"}
1 Shoots from distance
2 Cuts inside
3 Runs with ball often
4 Runs with ball less
5 Tries long range freekicks
6 Argues with referee
7 Tries killer balls
详细数据
2.2.0 :010 > Detail.each {|t| print "#{t.id} #{t.feature_id} #{t.title} \n"}
1 1 When no teammates around him
2 2 When a wrong footed player on him
3 7 When opponent team's defence is not blah blah
4 3 He thinks he is portuguese num. 7 winger
5 5 He is Juninho Some to titles.
标题中的一些数据
2.2.0 :005 > Title.each {|t| print "#{t.id} #{t.name} \n"}
1 Lord
2 Marquisse
3 Duke
4 Duchess
5 Baron
6 Baronesse
7 Chevalier
结果。
2.2.0 :021 > john = Root.get(1) # get root instance with id 1
=> #<Root @id=1 @name="John">
2.2.0 :022 > john.list_of_titles # returns array
=> ["Marquisse", "Duke", "Duchess"]
2.2.0 :023 > john.list_of_features #returns array
=> ["Shoots from distance", "Cuts inside", "Runs with ball often", "Tries long range freekicks", "Tries killer balls"]
2.2.0 :024 > john.list_of_features_with_details # array of hashes
=> [{"Shoots from distance"=>"When no teammates around him"}, {"Cuts inside"=>"When a wrong footed player on him"}, {"Runs with ball often"=>"He thinks he is portuguese num. 7 winger"}, {"Tries long range freekicks"=>"He is Juninho"}, {"Tries killer balls"=>"When opponent team's defence is not blah blah"}]
2.2.0 :025 > john.full_description # returns hash
=> {"titles"=>["Marquisse", "Duke", "Duchess"], "features"=>[{"Shoots from distance"=>"When no teammates around him"}, {"Cuts inside"=>"When a wrong footed player on him"}, {"Runs with ball often"=>"He thinks he is portuguese num. 7 winger"}, {"Tries long range freekicks"=>"He is Juninho"}, {"Tries killer balls"=>"When opponent team's defence is not blah blah"}]}
2.2.0 :027 > print john.full_json # returns json (just calling .to_json on above method)
{"titles":["Marquisse","Duke","Duchess"],"features":[{"Shoots from distance":"When no teammates around him"},{"Cuts inside":"When a wrong footed player on him"},{"Runs with ball often":"He thinks he is portuguese num. 7 winger"},{"Tries long range freekicks":"He is Juninho"},{"Tries killer balls":"When opponent team's defence is not blah blah"}]}