如何为返回不同类型数据的查询设计SQL模式

时间:2014-04-01 01:56:35

标签: sql database-design

我们有一个应用程序,我们需要返回许多结果,每个结果都可以与许多不同的属性相关联,这些属性可能很复杂。

为了解释这个问题,让我描述一种满足要求的可能设计。

一个。创建一个表,其中包含作为复杂属性的外键的列。

CREATE TABLE Results
(
  Id int NOT NULL,
  UserId int NULL,
  DataForTable1Id int NULL,
  DataForTable2Id int NULL,
  DataForTable3Id int NULL,
  DataForTable4Id int NULL,
  DataForTable5Id int NULL,
  DataForTable6Id int NULL,
  DataForTable7Id int NULL,
  DataForTable8Id int NULL,
  DataForTable9Id int NULL
)

B中。另外,每个复杂属性也可以与其他复杂属性相关联。例如,DataForTable1可能如下所示:

CREATE TABLE DataForTable1
(
    Id int NOT NULL,
    UserId1 int NULL,
    UserId2 int NULL,
) 

℃。为每个复杂属性创建单独的查询,例如:

SELECT * 
FROM 
    Table1 t 
    JOIN Results r on t.Id = r.DataForTable1Id
    LEFT JOIN Users u1 on r.UserId1 = u1.Id
    LEFT JOIN Users u2 on r.UserId2 = u2.Id`

这将解决问题,但需要为每个复杂属性执行单独的查询。当有大量结果时,这将无法理想地执行,尤其是在添加越来越复杂的属性时。

此外,表DataForTable1,DataForTable2等是需要在此要求之外的系统中存在的表。例如,这些表可能代表用户或应用程序之外的其他对象。

我想知道其他人是否正在解决类似的问题,如果是的话,他们是如何解决的。它可能是:“这就是我如何设计我的表格”以“停止使用关系数据库。这是你应该使用的......”。

任何建议都将受到赞赏。

谢谢, 埃里克

1 个答案:

答案 0 :(得分:1)

我不会为此使用RDMS。我会选择使用像Neo4j这样的图形数据库。系统中的每个属性都将表示为图中的节点。每个关联都将在图表数据库中表示为边。然后,您可以使用Cypher查询语言来获取数据库中的任何关系/关联。图形数据库非常适合表示这些类型的关系/关联,这些关系/关联有时难以在关系数据库中建模。