C# SQL理论多重引用

C# SQL理论多重引用,c#,sql,sql-server,entity-framework,database-design,C#,Sql,Sql Server,Entity Framework,Database Design,我正在设计一个数据库,有一个理论上的问题,关于哪个解决方案更适合运行查询,在MicrosoftSQLServer上更快,或者更简单地说更关系化 鉴于 假设我们有以下表格: 会议、人员、会议、会议室等。 不要介意那些名字。这些只是一些基本的独立实体 此外,我们还有一张名为“右”的桌子。权限有一个名称,可以定义对一个或多个基本实体的访问。每个人都可以分配这些权利 因此,还有两个表: 右侧和右侧 --------------------------------- | Right | P

我正在设计一个数据库,有一个理论上的问题,关于哪个解决方案更适合运行查询,在MicrosoftSQLServer上更快,或者更简单地说更关系化

鉴于 假设我们有以下表格: 会议、人员、会议、会议室等。 不要介意那些名字。这些只是一些基本的独立实体

此外,我们还有一张名为“右”的桌子。权限有一个名称,可以定义对一个或多个基本实体的访问。每个人都可以分配这些权利

因此,还有两个表: 右侧右侧

---------------------------------
| Right         | PersonRight   |
---------------------------------
| RightID       | PersonRightID |
| Name          | PersonID      |
| ...           | RightID       |
| ...           | ...           |
---------------------------------
炙手可热 现在只缺少一件事。表示与其他实体关系的方式或表格。我知道三种不同的方法都会奏效,但我没有足够的经验来决定哪一种是最好的

1。关系方式?

升级:为每个新实体添加一个新表

关系:右1:N个实体

优点:添加新实体不会以任何方式影响其他实体,例如实体的外键

缺点:许多表可能有冗余列,如CreatedDate或rowguid

SQL示例::

2。列路?

2.1列方式1

升级:对于每个新实体,在表“Right”中添加一个新列

关系:右1:1实体

优点:不需要新表、小语句、实体外键

缺点:每个新实体都会影响所有其他行,可能只有1:1的关系,列计数可能会混淆

SQL示例::

2.2立柱方式2

升级:对于每个新实体,在表“RightReference”中添加一个新列

关系:右1:N个实体

优点:1:N关系,只有一个新表,小语句,实体外键

缺点:每个新实体都会影响所有其他行,列计数可能会混淆

SQL示例::

3。参考方式

升级:对于每个新实体,使用新的ReferenceTypeID向RightReference添加新行

关系:右1:N个实体

优点:只有一个新表和动态引用

缺点:匿名引用,并且总是要记住构建查询的索引,没有实体的外键

解释:ReferenceID是被引用实体/行的主ID,如表Congress、Session等。因此,您无法建议它引用哪个表。因此,存在ReferenceTypeID。它指向一个名为ReferenceType的转换表,其中每个表都存储有一个唯一的id。也许可以使用系统方法OBJECT_id代替

SQL示例::

现在向所有sql专家致意。 处理此任务的最佳或更好的解决方案/方式/方法是什么? 如果你有其他方法,请告诉我

我要寻找的是:一般的优点和缺点、SQL性能、EntityFramework的实现困难以及您所知道或想到的其他一切


谢谢

通常在处理关系数据库时,任何需要更改模式的操作都是不允许的,因为您必须在SQL server上执行潜在的危险操作,更新EF以及您可能使用的任何模型,并可能重新部署用作数据库前端的任何应用程序

SQL解决方案 如果您同意在每次添加新实体或出于其他原因绑定到RDBMS时提交“否”,则有两个选项:

如果您关心您的实体(会议、会议、会议室)表架构 列方式#2可能是最好的主意,因为它将关系数据与实际表数据分离。为实体和权限之间的关系制作一个单独的表,并在每个可能的entityId上放置一个索引。在您的示例中,需要对CongressId、SessionId和RoomId列进行索引

如果您不关心实体表模式 将所有实体表合并为一个大型实体表,其中包含Id列和XML列,XML列包含所有实际实体信息,如类型。实体和权利之间的单一关系,你很好

NoSQL解决方案 如果你能走这条路,它可能更适合你想要的灵活结构。您仍然需要更新访问文档存储的代码,但从您的建议来看,这似乎是不可避免的,除非您有一些非常灵活但容易出错的代码


您不需要在每次添加新实体类型时都进行schema/EF更新,也不需要担心关系。您的Person对象的所有权限都将嵌套在内部,并将以这种方式存储在文档存储中。

选项3基本上会使SQL在创建关系时设置的所有约束失效。这个问题很难回答,因为你提到了实体框架,但引用了SQL查询。如果你要使用实体框架,你将使用LINQ,我建议你考虑从这个角度来分析这个问题。是的,奎克,你说得对。我还编写了实体框架,因为我想使用带有C#和实体框架的数据库。我发现EF开发者的想法也很重要,哪种解决方案是最好的。谢谢你的回答。在写了问题并读了几遍之后,我也看到了2.2栏方式2的最大优势。但我不明白的是,你的NoSQL解决方案到底是什么意思。你有什么实际的例子吗?(详细信息和更多技术描述或代码示例)@Steven Spyka您对MongoDB或RavenDB是否完全熟悉?不太熟悉。我知道它们确实存在,但我也不认为(如果我错了,请教我)它们存在
---------------------------------
| Right         | PersonRight   |
---------------------------------
| RightID       | PersonRightID |
| Name          | PersonID      |
| ...           | RightID       |
| ...           | ...           |
---------------------------------
select *
from Right r
left join RightCongress rc on r.RightID     = rc.RightID
left join RightSession  rs on r.RightID     = rs.RightID
left join RightRoom     ro on r.RightID     = ro.RightID
left join Congress      ec on rc.CongressID = ec.CongressID
left join Session       es on rs.SessionID  = es.SessionID
left join Room          er on ro.RoomID     = er.RoomID 

-------------------------------------------------------
| RightCongress   | RightSession    | RightRoom       |
-------------------------------------------------------
| RightCongressID | RightSessionID  | RightRoomID     |
| RightID         | RightID         | RightID         |
| CongressID      | SessionID       | RoomID          |
| ...             | ...             | ...             |
-------------------------------------------------------
select *
from Right r
left join Congress ec on r.CongressID = ec.CongressID
left join Session  es on r.SessionID  = es.SessionID
left join Room     er on r.RoomID     = er.RoomID

-----------------
| Right         |
-----------------
| RightID       |
| Name          |
| CongressID    |
| SessionID     |
| RoomID        |
-----------------
select *
from Right r
inner join RightReference rr on r.RightID on rr.RightID
left join Congress ec on rr.CongressID = ec.CongressID
left join Session  es on rr.SessionID  = es.SessionID
left join Room     er on rr.RoomID     = er.RoomID

---------------------------------------
| Right            | RightReference   |
---------------------------------------
| RightID          | RightReferenceID |
| Name             | RightID          |
| ...              | CongressID       |
| ...              | SessionID        |
| ...              | RoomID           |
| ...              | ...              |
---------------------------------------
select *
from Right r
inner join RightReference rr on r.RightID = rr.RightID
left join Congress ec on rr.ReferenceID = CongressID and rr.ReferenceType = 1
left join Session  es on rr.ReferenceID = SessionID  and rr.ReferenceType = 2
left join Room     er on rr.ReferenceID = RoomID     and rr.ReferenceType = 3

----------------------------------------------------------
| Right            | RightReference   | ReferenceType    |
----------------------------------------------------------
| RightID          | RightReferenceID | ReferenceTypeID  |
| Name             | RightID          | Name             |
| ...              | ReferenceID      | ...              |
| ...              | ReferenceTypeID  | ...              |
| ...              | ...              | ...              |
----------------------------------------------------------