我有4个表(指定,类,选举,状态),我想交叉引用到单个表的(成员)列.基于历史表(members_history),4个表的值是时间敏感的.期望的结果是查询应输出成员行内的所有成员和当前指定位置或当前选择的位置,类和状态,并包括从外部行获得的附加信息.
所以而不是只返回:
id,username,password,salt,name_first,name_last,date_join&date_leave;
查询将返回
ID,用户名,密码,盐,name_prefix,name_first,name_last,hours_extra,date_join,date_leave, ,,appointed 和;classelectedstatus
如果添加的列在历史记录中没有当前值,则其结果应为NULL.
现在我觉得我可以用子查询做到这一点,但到目前为止我一直在敲击键盘.稍后我会再接下来,但在那之前,还有其他人愿意试一试,还是试图指出我正确的方向?
我的SQL(没有双关语)表的结构如下:
CREATE TABLE IF NOT EXISTS `members` (
`id` mediumint(3) unsigned NOT NULL auto_increment COMMENT 'Members Unique Id',
`username` varchar(32) collate utf8_bin NOT NULL COMMENT 'Mebers Username',
`password` varchar(64) collate utf8_bin NOT NULL COMMENT 'Members Password Hash',
`salt` varchar(32) collate utf8_bin NOT NULL COMMENT 'Members Password Salt',
`name_first` varchar(32) collate utf8_bin NOT NULL COMMENT 'Members First Name',
`name_last` varchar(32) collate utf8_bin NOT NULL …Run Code Online (Sandbox Code Playgroud) 我正试图在Ruby on Rails中设计一个成就系统,并且遇到了我的设计/代码.
试图使用多态关联:
class Achievement < ActiveRecord::Base
belongs_to :achievable, :polymorphic => true
end
class WeightAchievement < ActiveRecord::Base
has_one :achievement, :as => :achievable
end
Run Code Online (Sandbox Code Playgroud)
迁移:
class CreateAchievements < ActiveRecord::Migration
... #code
create_table :achievements do |t|
t.string :name
t.text :description
t.references :achievable, :polymorphic => true
t.timestamps
end
create_table :weight_achievements do |t|
t.integer :weight_required
t.references :exercises, :null => false
t.timestamps
end
... #code
end
Run Code Online (Sandbox Code Playgroud)
然后,当我尝试下面的抛弃单元测试时,它会失败,因为它表示该成就为空.
test "parent achievement exists" do
weightAchievement = WeightAchievement.find(1)
achievement = weightAchievement.achievement
assert_not_nil achievement
assert_equal 500, weightAchievement.weight_required
assert_equal …Run Code Online (Sandbox Code Playgroud) 为了学习sqlalchemy(和python),我试图复制一个已经存在的项目,但是我很难用postgres搞清楚sqlalchemy和继承.
这是我们的postgres数据库的一个例子(显然,这是简化的):
CREATE TABLE system (system_id SERIAL PRIMARY KEY,
system_name VARCHAR(24) NOT NULL);
CREATE TABLE file_entry(file_entry_id SERIAL,
file_entry_msg VARCHAR(256) NOT NULL,
file_entry_system_name VARCHAR(24) REFERENCES system(system_name) NOT NULL);
CREATE TABLE ops_file_entry(CONSTRAINT ops_file_entry_id_pkey PRIMARY KEY (file_entry_id),
CONSTRAINT ops_system_name_check CHECK ((file_entry_system_name = 'ops'::bpchar))) INHERITS (file_entry);
CREATE TABLE eng_file_entry(CONSTRAINT eng_file_entry_id_pkey PRIMARY KEY (file_entry_id),
CONSTRAINT eng_system_name_check CHECK ((file_entry_system_name = 'eng'::bpchar)) INHERITS (file_entry);
CREATE INDEX ops_file_entry_index ON ops_file_entry USING btree (file_entry_system_id);
CREATE INDEX eng_file_entry_index ON eng_file_entry USING btree (file_entry_system_id);
Run Code Online (Sandbox Code Playgroud)
然后插入将使用触发器完成,以便它们正确插入子数据库.就像是:
CREATE FUNCTION file_entry_insert_trigger() RETURNS "trigger"
AS …Run Code Online (Sandbox Code Playgroud) python postgresql inheritance sqlalchemy polymorphic-associations
如何在.NET中有效/高效地创建多态关联?
话虽如此,我还有一些更细微的问题,我希望将其作为更广泛答案的一部分.
技术
上下文
我正在开发一个面向消费者的应用程序,包括DAL,业务对象层,服务代理层(用于REST服务),最终包括Web,平板电脑,移动和桌面前端.
该应用程序涉及数百种符合各种分类的产品.此外,产品由各种属性组成,这些属性也可能是其更广泛分类的属性.
例:
"小部件A"和"小部件B"都是红色的,因此它们可以在"红色的东西"下的视图中分组.然而,"小部件A"是玩具车,而"小部件B"是红色自行车,因此尽管它们都是红色物体,但它们是不同类型的物体.因此,它们可以在其他视图中被不同地分组(例如,"自行车",其将显示红色自行车,蓝色自行车等).
目标
创建一个有效的核心和服务层,既响应调用者又易于维护.
我在想做什么
为了轻松管理所有这些不同的属性和关系,我想到构建一个"全局"属性表,其中可以为各种类型的对象记录属性:
GLOBAL_ATTRIBUTES_TABLE
ID (INT)ObjectType (int) - FK到ObjectTypes表包含类型列表(例如自行车,玩具车等)ObjectId (int) - 它自己的表中对象的id(例如"Bicycles Table")AttributeType (int) - FK到AttributeTypes表,其中包含各种类型的属性(例如"颜色","材料","年龄组").AttributeId (int) - 它自己的表中属性的id(例如"Colors Table")因此,第3列和第5列(ObjectId和AttributeId)理想情况下将具有与其类型对应的表的动态外键.
我的想法是,这将使搜索更快,模型构造更容易,更简洁(代码方面),更容易添加未来属性和对象类型,维护更容易等.
问题
这是一个可接受的或好的方法(而不是创建,比如产品表,系列表等,有一英里长的列列表)?
有没有办法在.NET中完成动态外键/多态关联,只需简单地进行查询,使用结果构建模型,查询该模型等等?
对于更好的数据架构还有其他建议吗?
我怀疑问题在于我创建多态图像属性的方式.我fields_for在表格中使用.在这种情况下,用户可以使用回形针创建帖子并添加图像,并将其与S3一起存储.我正在使用多态图像模型"post_image":
class PostImage < ActiveRecord::Base
belongs_to :imageable, :polymorphic => true
#.merge(PAPERCLIP_OPS)
has_attached_file :image, :styles => { :medium => "200x200>", :thumb => "50x50>" },
:storage => :s3,
:s3_credentials => "#{Rails.root}/config/s3.yml",
:path => "/:style/:id/:filename",
:bucket => "zounds-dev"
validates_attachment_presence :image
validates_attachment_size :image, :less_than => 5.megabytes
end
Run Code Online (Sandbox Code Playgroud)
邮政模式:
class Post < ActiveRecord::Base
has_many :post_images, :as => :imageable, :dependent => :destroy
.
.
.
accepts_nested_attributes_for :post_images, :reject_if => lambda { |t| t[:post_image].nil?}, :allow_destroy => true
end
Run Code Online (Sandbox Code Playgroud)
新邮政表格:
=form_for( setup_post(@post,current_user), :html => { …Run Code Online (Sandbox Code Playgroud) amazon-s3 paperclip polymorphic-associations ruby-on-rails-3
我需要一个玩家拥有许多结构和属于玩家的结构.结构是一种多态关系.
class Player < ActiveRecord::Base
has_many :player_structures
has_many :structures, :through => player_structures
end
class PlayerStructures < ActiveRecord::Base
belongs_to :structure, polymorphic: true
belongs_to :player
end
class StructureA < ActiveRecord::Base
has_one :player_structure, :as => :structure
has_one :player, :through => :player_structure
end
class StructureB < ActiveRecord::Base
has_one :player_structure, :as => :structure
has_one :player, :through => :player_structure
end
Run Code Online (Sandbox Code Playgroud)
但如果我退出Player.first并询问其结构,它会给出:
ActiveRecord::HasManyThroughAssociationPolymorphicSourceError: Cannot have a has_many :through association 'Player#structures' on the polymorphic object 'Structure#structure'.
Run Code Online (Sandbox Code Playgroud)
但它应该能够生成一个SQL查询,在其中找到所有带有id的player_structures,然后根据structure_id和structure_type获取结构.为什么会失败?如何有效地构建多态连接表?
如果我按照手动方式执行操作,则可以:
player_structures.collect(&:structure)
Run Code Online (Sandbox Code Playgroud)
Rails,你不这样做吗?
我在两个模型之间存在一个现有的has_many关系 - 称为'汽车'和'乘客' - 在我的生产环境中有几千个"乘客"属于几百个"卡".我正在添加另一个模型,称之为"火车",我想将汽车和乘客之间现有的has_many关系改为多态,将每位乘客与汽车或火车相关联.
我的迁移应该是什么样的?我想在迁移时保留数据库中的现有关系,所以我宁愿做一些表重命名,而不是删除一列来替换另一列.此外,我希望能够在不打开服务器控制台并手动编辑所有记录的情况下完成此操作,因此当我将更改推送到生产环境时,我可以一举迁移整个数据库.有什么建议?
TL; DR:如何使用新模型将现有的has_many关系更改为多态?
实体是否可能与多个表具有一对一多态关联.假设一个实体有两个特定的列,用于:
link_type - 标识应与哪个表关联的列
link_id - 在标识表后定义表的外键的列.
我有一个ASSETS具有如下所示结构的表:
----------------------------------------------------
ID (PK) | DESCRIPTION | TYPE | Do- | Do+ | Dx- | Dx+
----------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
TYPE列具有外键,可能的值是SECURITY或CURRENCY(即FX),还我有两个多个表:CURRENCIES(例如,EUR,RUB或USD):
--------------------------------------------------------
ID (PK)| FROM (FK ASSETS.ID) | TO (FK ASSETS.ID) | VALUE
--------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
和SECURITIES(例如,MTS,GAZP或VTB):
----------------------------------------------------------
ID (PK)(FK ASSETS.ID)| CURRENCY (PK)(FK ASSETS.ID) | VALUE
----------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我怎样才能让一个约束,不仅行为像外键CURRENCIES.FROM,CURRENCIES.TO并且SECURITIES.CURRENCY,还要检查是否指 …
sql database schema database-design polymorphic-associations
假设我们有两个类,每个类实现一个接口,IParent,如下所示:
public class Foo : IParent
{
public long Id { get; set; }
...
public IList<Child> Children { get; set; }
...
}
public class Bar : IParent
{
public long Id { get; set; }
...
public IList<Child> Children { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
并且具有IParent类型的父属性的子类,即父类可以是Foo或Bar:
public class Child
{
public long Id { get; set; }
...
public IParent Parent { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
如何使用FluentNHibernate映射此Parent属性?
我发现这个问题似乎有类似的要求,但没有涉及接口.答案对我来说没有意义,或者在这种情况下似乎适用.
我尝试使用ReferencesAny如下实现映射:
public class ChildMap : …Run Code Online (Sandbox Code Playgroud) sql ×3
ruby ×2
.net ×1
achievements ×1
amazon-s3 ×1
c# ×1
database ×1
entities ×1
foreign-keys ×1
hibernate ×1
inheritance ×1
jointable ×1
jpa ×1
linq ×1
mysql ×1
nhibernate ×1
paperclip ×1
postgresql ×1
python ×1
schema ×1
sqlalchemy ×1