设置外键约束的常用方法是选择外键指向哪个表.
我在1个表和一组表之间有多态关系.
这意味着该表将与集合中的其中一个表有关系.
例如.
images: person_id, person_type
subordinates: id, col1, col2...col9
products: id, colA, colB...colZ
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,如果person_type是"subordinates",那么person_id应该是subordinates.id的外键,并且产品也是如此.
所以我想知道,是否有可能将一个外键用于其中一个表,或者你必须专门设置它在指定一个表时指向哪个表.
这个问题适用于MySQL和PostgreSQL.
谢谢
我已经阅读了Bill Karwin关于单表继承的一些答案,并认为这种方法对我正在考虑的设置有好处:
Playlist
--------
id AUTO_INCREMENT
title
TeamPlaylist
------------
id REFERENCES Playlist.id
teamId REFERENCES Team.id
UserPlaylist
------------
id REFERENCES Playlist.id
userId REFERENCES User.id
PlaylistVideo
-------------
id
playlistId REFERENCES Playlist.id
videoId REFERENCES Video.id
Run Code Online (Sandbox Code Playgroud)
所有CASCADE选项都设置DELETE为在Playlist删除a时正常工作,但是,如果删除User或Team删除会发生什么?
即.如果User被删除,在行UserPlaylist会被删除,但被引用的行中Playlist,并PlaylistVideo仍将保留.我考虑过强制执行此操作,TRIGGER AFTER DELETE但无法知道删除请求是否因为Playlist已删除或删除而导致User.
在这种情况下,强制执行诚信的最佳方法是什么?
编辑(提供ERD)

mysql referential-integrity single-table-inheritance polymorphic-associations cascading-deletes
在类似的应用程序,以计算器,我建设,我想决定什么关系我的Questions,Answers和Comments表应该有.
我可以拥有Questions并且Answers都由一张桌子代表Posts.
这将允许Comments有一个外键Posts.
但是,如果Questions并且Answers是单独的表,那么Comments这些表中应该有什么关系呢?
更新:尽管所选答案建议使用类表继承方法,这似乎是数据库术语中的最佳方法,但Rails ORM不支持此选项.因此,在Rails中,我的模型必须使用单表继承,并且可能如下所示:
class Post < ActiveRecord::Base
end
class Question < Post
has_many :answers, :foreign_key => :parent_id
has_many :comments, :foreign_key => :parent_id
end
class Answer < Post
belongs_to :question, :foreign_key => :parent_id
has_many :comments, :foreign_key => :parent_id
end
class Comment < Post
belongs_to :question, :foreign_key => :parent_id
belongs_to :answer, :foreign_key => :parent_id
end
class CreatePosts …Run Code Online (Sandbox Code Playgroud) 我想知道这是否可行.
我希望根据表1的数据加入2个表.示例表1包含列食物,其数据为"热狗".
我有一张叫热狗的桌子.
是否可以像JOIN一样进行JOIN.
SELECT * FROM table1 t join t.food on id = foodid
Run Code Online (Sandbox Code Playgroud)
我知道它不起作用,但它甚至可行,是否有一个工作周围?
提前致谢.
我对数据库设计还不熟悉,但我理解基础知识.我正在创建一个关系数据库,我想做一些类似于创建可重用类型或类的东西.例如,假设我有一张Customer桌子和一张Item桌子.客户和项目通过标准的1对多关系相关联,因此Item有一个名为的列CustomerId.
我还想为每个客户和每个项目提供多个"备注" .在普通的OOP模型中,我只需创建一个Note类,并在需要时创建它的实例.当然,关系数据库是不同的.我正在考虑拥有一张Note桌子,我想在Customer和Note之间建立一对多的关系,以及Item和Note.那么问题是Note表必须为每个其他表有一个列,希望使用这个"类型".(见下面的例子)

我还想过,我可以在Note和Customer/Item(或其他)之间创建一个中间表.这将允许我避免在每个引用它的表的Note中有额外的列,因此当我添加更多需要注释的表时,注释可以保持不变.我认为这是更好的解决方案.(见例)

通常如何处理这种情况?我接近正确吗?我很感激有关如何设计我的数据库以获得我上面描述的那种功能的任何建议.
我在关系数据库中有以下表:
[Sensor]
LocationId [PK / FK -> Location]
SensorNo [PK]
[AnalogSensor]
LocationId [PK/FK -> Sensor]
SensorNo [PK/FK -> Sensor]
UpperLimit
LowerLimit
[SwitchSensor]
LocationId [PK/FK -> Sensor]
SensorNo [PK/FK -> Sensor]
OnTimeLimit
[Reading]
LocationId [PK/FK -> Sensor]
SensorNo [PK/FK -> Sensor]
ReadingDtm [PK]
[ReadingSwitch]
LocationId [PK/FK -> Reading]
SensorNo [PK/FK -> Reading]
ReadingDtm [PK/FK -> Reading]
Switch
[ReadingValue]
LocationId [PK/FK -> Reading]
SensorNo [PK/FK -> Reading]
ReadingDtm [PK/FK -> Reading]
Value
[Alert]
LocationId [PK/FK -> Reading]
SensorNo [PK/FK -> Reading]
ReadingDtm …Run Code Online (Sandbox Code Playgroud) 所以我在数据库设计方面做了一些练习,出现了一个问题,我无法弄清楚如何纠正.
我对此很陌生,所以我不是最好的,但在这里.
所以我想创建两个不同的表,一个叫做Team,另一个叫做Player.这些表彼此差异很大.
然后我想要另一个名为Challenge的表,我想引用Team或Player.
基本上有比赛,他们要么单独比赛,要么作为一个团队.我想要一个外键来引用团队,如果它是一个团队挑战,或者玩家,如果它是个人.
我无法组合这两个表,因为它们包含非常不同的元素.
我只是有点困惑如何做到这一点.我可以只有一个外键,它将引用一个或另一个表.或者我应该有两个,一个为空.
或者我可以在团队和播放器中添加另一个ID密钥.然后在Challenge中,如果一个新的Type键表明它是一个组,它将引用Team,如果它的个体,它引用Player.
再一次,这个很新,所以希望我有道理.
我有一个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
我有2个表,都有自己的自动递增ID,这当然是主键.
当我想创建第3个表来建立这两个表之间的关系时,我总是有一个错误.
第一个是关于你只能有一个自动递增的列,第二个是当我从那些2中删除auto_increment语句时发生的,因此sql不允许我将它们作为外键,因为类型匹配失败.
有没有办法可以创建关系表而不会丢失自动增量功能?
另一种可能的(但不是优选的)解决方案可能是第一个表中有另一个主键,当然是用户的用户名,而不是自动增量语句.这是不可避免的吗?
提前致谢.
在一个表中使用一组外键的技术的名称是什么,其中除了一个外,其他所有外键都是NULL?
换句话说,每行需要一个外键到n个不同的可能表中的一个(并且只有一个),因此您实际上拥有所有必需的外键,但除了一个之外的所有外键都是NULL.
(Django的用户可能会认为这是使用通用外键的替代方法)
我正在建立一个类似于Yelp(推荐引擎,虽然规模较小)的网站,因此系统中将有三个主要实体:用户,地方(包括商家)和活动.
现在我想知道的是如何为每种类型的实体存储照片,评论和"赞美"(类似于Facebook的"赞")等信息,以及它们可以应用于每个对象的信息(例如评论推荐,照片等).现在,我这样做的方式是每个ie的单个表
类型表示的照片(id,type,owner_id,is_main等等)
:1 =用户,2 =地点,3 =事件注释(id,object_type,object_id,user_id,content等等)
,其中object_type可以是一些不同的对象,如照片,推荐等Compliment(object_id,object_type,compliment_type,user_id)
其中object_type可以是一些不同的对象,如照片,推荐等Activity(id,source,source_type,source_id等等)
//for "activity feed"
,其中source_type是用户,地点或事件通知(id,收件人,发件人,activity_type,object_type,object_id等等)
,其中object_type和object_id将用于提供与通知对象的直接链接,例如用户的照片被称赞
但是在 阅读 SO上的一些帖子之后,我意识到我无法使用外键保持参照完整性,因为这需要1:1的关系,而我的source_id/object_id字段可以与多个表中的ID相关.所以我决定采用保持主实体的方法,然后将其分解为子集,即
User_Photo(photo_id,user_id)| Place_Photo(photo_id,place_id)| 等等...
Photo_Comment(comment_id,photo_id)| Recommendation_Comment(comment_id,rec_id)| 等等...
赞美(id,...)
//would need to add a surrogate key to Compliment table nowPhoto_Compliment(compliment_id,photo_id)| Comment_Compliment(compliment_id,comment_id)| 等等...
User_Activity(activity_id,user_id)| Place_Activity(activity_id,place_id)| 等等...
我以为我可以创建将每个子表连接到主表的视图,以获得我想要的结果.另外我认为它也适合我在Code Igniter中的对象模型.
我认为唯一可以离开的表是通知表,因为有很多对象类型(论坛帖子,照片,推荐等等),这个表只会保留一周的通知,所以任何参考完整性问题都不应该是'这是一个很大的问题(我认为).
我是否以明智的方式解决这个问题?我可能忽略的任何性能,可靠性或其他问题?
我能看到的唯一"问题"是我最终会得到很多表(因为现在我有大约72个,所以我想在添加额外内容之后我最终会得到一些不到90个表),就我所知,这不是问题.
非常感谢任何反馈.提前致谢.
编辑:为了清楚起见,我并不担心我最终还有10张桌子.据我所知,表的数量并不是太大的问题(一旦它们被使用)......除非你说200左右:/
mysql database-design comments photo polymorphic-associations
我有以下实体:
public class Notification
{
public int Id { get; set; }
public string Title { get; set; }
public Guid RefId { get; set; }
public Object Ref { get; set; } // << The navigation property: Sometime its type is Poll and sometime is Test, maybe I add other types too
public NotifTypes Type { get; set; }
}
public enum NotifTypes
{
Poll=1,
Test=2,
// Other NotifTypes here
}
//-------------------------------------------------------------------
public class Test
{
public int Id …Run Code Online (Sandbox Code Playgroud) 如果我有用户,以及用户组(如当地天文学团体/俱乐部),并且我希望两者都与街道地址有一对多的关系,我可以只有一个地址表和两个fk,这样我就不会不必复制表模式?或者更好的做法是只有2个单独的表,user_addresses和user_group_addresses?感谢您的输入和时间,谢谢!
database ×7
mysql ×6
sql ×4
c# ×1
code-first ×1
comments ×1
doctrine ×1
foreign-keys ×1
join ×1
orm ×1
photo ×1
php ×1
postgresql ×1
schema ×1
types ×1