我有很多实例需要在我的数据库中实现某种多态关联.我总是浪费大量的时间来思考所有的选择.这是我能想到的3.我希望有一个SQL Server的最佳实践.
这是多列方法

这是没有外键的方法

这是基表方法

sql-server associations polymorphic-associations database-normalization
我有几个表,我想从PDF表中引用一列到多个其他表.

例如,如果PDF表格select输出如下所示:
ITEM_TYPE ITEM_ID QUANTITY
1 23 3
2 12 1
Run Code Online (Sandbox Code Playgroud)
它告诉我:
PDF上面有3个车轮产品和1个车模板标题;
我编写了SQL代码,但无法正常工作:
CREATE TABLE `pdf_created` (
`id` INT(10) UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT,
`pdf_id` INT(10) NOT NULL,
`item_type` INT(3) UNSIGNED NOT NULL,
`item_id` INT(10) UNSIGNED NOT NULL,
`quantity` INT(3) NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_pdf_id` (`pdf_id`),
CONSTRAINT `FK_pdf_id` FOREIGN KEY (`pdf_id`) REFERENCES `pdf` (`id`),
KEY `FK_item_type` (`item_type`),
CONSTRAINT `FK_item_type` FOREIGN KEY (`item_type`) REFERENCES `item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
KEY `FK_item_id` (`item_id`),
CONSTRAINT …Run Code Online (Sandbox Code Playgroud) 设置外键约束的常用方法是选择外键指向哪个表.
我在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.
谢谢
多态协会(PA)对于相对简单的数据库要求非常满意:让各种表在一个共享表中具有子记录.经典示例是具有注释记录的单个表,其适用于不同的不一定类似的实体.
在这个问题中, Mark做了很好的工作,展示了实现PA的三种常用方法.我想使用基表方法,Bill Karwin在同样优秀的答案中对此进行了更详细的描述.
一个具体的例子如下:

实体的主键引用基表中的相同键值,而注释表引用基表,因此可以观察到引用完整性.这里的关键部分是实体表的主键具有不同的域.它们是通过在基表中创建新记录并将其生成的密钥复制到实体的主键来生成的.
现在我的问题是:如果我想在具有生成自己的,相互重叠的主键的实体的现有数据库中引入具有引用完整性的PA,该怎么办?
到目前为止,我看到两个选项:
选项1:

每个实体都保留自己的主键,但也获得备用键.
喜欢:
不喜欢:
选项2:

每个实体在基表中都有自己的外键列.这看起来像Mark的多列方法.
喜欢:
不喜欢:
我倾向于选项1,可能在Base表中使用字段"EntityName"进行双向查找.哪个选项会更好.或者是另一种甚至更好的方法?
refactoring database-design polymorphic-associations sql-server-2008
我已经阅读了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
只是想找出为以下场景设计表的最佳方法:
我的系统中有几个区域(文档,项目,组和客户端),每个区域都可以记录注释.
我的问题是我应该有这样一个表:
CommentID
DocumentID
ProjectID
GroupID
ClientID
etc
Run Code Online (Sandbox Code Playgroud)
只有一个id会有数据,其余的将是NULL,或者我应该有一个单独的CommentType表,并且我的注释表如下:
CommentID
CommentTypeID
ResourceID (this being the id of the project/doc/client)
etc
Run Code Online (Sandbox Code Playgroud)
我的想法是,从索引的角度来看,选项2会更有效.它是否正确?
这里我们在EF Core上有3个表:
还有更多(新闻,项目除外):内容,帖子,表格等
和我的模型定义
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public Link Link { get; set; }
}
public class News
{
public int Id { get; set; }
public string Header { get; set; }
public string Content { get; set; }
public Link Link { get; set; }
}
public class Link
{
public int Id …Run Code Online (Sandbox Code Playgroud) c# entity-framework-core .net-core asp.net-core ef-code-first-mapping
我有一个表,其中包含两种类型的数据,要么是公司数据,要么是员工数据。
通过“C”或“E”以及存储其主键的列来识别该数据。
那么我如何根据包含的数据给出外键并动态维护引用完整性。
id | referenceid | documenttype
-------------------------------
1 | 12 | E
2 | 7 | C
Run Code Online (Sandbox Code Playgroud)
现在,id 为 1 的行应引用 pk 12 的 Employee 表,而 id 2 的行应引用 pk 7 的 Company 表。
否则我必须为两者制作两个不同的表格。有没有其他方法可以实现它。
为了解我正在谈论的内容,考虑一个实体(在我的情况下,它是一个Task),它可以链接到系统中的任何数量的其他实体.为了我们的目的,让我们说这个任务可以链接到:
所有这些都在数据库中用自己的表表示.现在,任务可能可能与任何一个任务相关联,并且由于系统处于活动开发状态,潜在链接列表将继续相对快速地增长.请注意,这些是1对多关系 - 任务一次只能链接到其中一个,但是一个帐户可能有多个与之关联的任务.
现在,我已经考虑了一些选项,但我不认为自己是数据库设计方面的任何专家,所以我想我会伸手去拿.我考虑过的选项包括:
Task表中每个链接的外键,我们只需要不断添加列.但是,由于任务一次不能链接到多个任务,这将导致许多FK列具有NULL值.每当我们添加新链接时,这还需要在我们的应用程序中使用新列并重新生成我们的数据库模型.
其中的单个列Task充当外键,但包含另一个指定链接的列type,因此在查询时,我们可以根据类型确定发生了哪些JOIN.因此,帐户和人员ID都将在此列中显示其任务,但链接类型列将指定ID是个人还是帐户.这对我来说非常危险,显然数据库无法强制执行约束.
其他选择??
我很乐意,如果有人能指出我的"更干净"设计的方向,但如果没有,多列会作为FK约束,但允许NULL是最好的选择吗?
提前致谢!
我所处的情况是一张表有两个一对一/一关系。如何使用实体框架代码优先来实现这一点?
我看过以下链接
从本质上讲,从属端需要有一个与主体端相同的主键。但我厌倦了在没有确认和正确了解正在发生的事情的情况下通过多个一对一/一关系来实现这一点。此外,我不确定如何构建语句,因为它没有传统的外键。
我还看到了在表实体框架之间配置多个 1 到 0..1 关系,这让我困惑得无法辨认。
请参阅下面我的数据库图的相关部分:
所以本质上,aPlayer不应该在没有 a 的情况下保存DKImage,同样,aProduct不应该在没有 a 的情况下保存DKImage。
下面是模型的代码:Players,,Products(我知道这是不正确的,我只是这样实现的,这样我就可以生成数据库并显示DKImages图表)
public enum Positions { PG, SG, SF, PF, C }
public class Player
{
[Key]
[ForeignKey("Images")]
public int PlayerID { get; set; }
[Required]
public string PlayerName { get; set; }
[Required]
public string PlayerLastName { get; set; }
[Required]
public int PlayerAge { …Run Code Online (Sandbox Code Playgroud) 我有以下实体:
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) mysql ×4
c# ×3
sql ×3
sql-server ×3
foreign-keys ×2
.net-core ×1
asp.net-core ×1
associations ×1
code-first ×1
database ×1
postgresql ×1
refactoring ×1