在表之间建立关系时,幕后发生了什么?

时间:2018-10-17 18:19:18

标签: sql relational-database powerbi

这个问题不仅限于Power BI,而且可以帮助我解释我的问题。

如果Power BI中有多个表,则可以通过将一列从一个表拖到另一个表中来建立它们之间的关系,

enter image description here

然后您可以通过单击出现的行来编辑该关系:

enter image description here

顺便说一下,这是两个表的结构:

# Table1
A,B
1,abc
2,def
3,ghi
4,jkl

# Table2
A,C
1,abc
1,def
2,ghi
3,ghit

这很好用,因为表1中的A列包含唯一值,并且可以用作主键。现在,您可以转到Report tab,设置两个表,并通过按需在表1中的A下单击或引入切片器,按自己的意愿进行切片和切块:

enter image description here

但是事情是,您可以在没有建立表之间关系的情况下完成 。删除Relationships下的relationshiop,然后返回Report并选择Home > Manage Relationships以了解我的意思:

enter image description here

如对话框中的'There are no relationships defined yet.'所示,但是您可以像以前一样通过在另一个表中进行选择来仍然子集( EDIT:在RADO的答案中证明是错误的)。我知道,您可以突出显示切片器并选择Format > Edit Interactions并取消选择与切片器关联的表。但是我仍然对整个事情感到困惑。

那么,这里有我不知道的事情正在发生吗?或者表之间的关系真的是由表的内容定义的吗?因为表中相关值的存在与潜在主键(自然的或合成的)的存在使得可以使用SQL,dplyr动词或任何其他形式的查询技术来查询它们。而且您真的不需要显式定义的关系吗?

或者换句话说,建立Power BI表关系是否具有SQL等效项?也许像the following

CREATE TABLE Persons (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
    PRIMARY KEY (ID)
);

对不起,如果我在这里闲逛,但我只是非常感到困惑。到目前为止,谷歌搜索只会加剧混乱。因此,谢谢您的任何见解!

3 个答案:

答案 0 :(得分:1)

您的陈述“但是您仍然可以像以前一样通过在另一个表中进行选择来对一个表进行子集化”,这是正确的。这是一个关键问题。

通过关系可以在Power BI中传播筛选器上下文。这是一个非常繁琐的短语,如果您打算使用Power BI,则必须了解它的含义。这是最重要的概念。

要理解我的意思,您将需要编写DAX度量并尝试使用表对其进行操作。有或没有关系时,您会立即看到差异。

整个系统如何工作(简化): PowerBI包含一种称为“ DAX”的语言。您将在DAX中创建度量,然后PowerBI会将其转换为其内部语言xmSQL,这是SQL的一种特殊形式。在xmSQL中,常规连接被转换为LEFT OUTER JOIN,如下所示:

SELECT SUM(Sales.Amount)
FROM Sales
LEFT OUTER JOIN Customer
ON Sales.Customer_Key = Customer.Customer_Key

双向关系较为复杂,但在概念上相似。

总体而言,当您在表之间创建关系时,您正在告诉PowerBI引擎如何联接表。然后,引擎还添加了一些优化措施以加快查询速度。 每次执行DAX度量时,单击切片器或视觉效果,PowerBI都会在后台生成多个xmSQL语句,执行它们,然后将其结果呈现为视觉效果。您可以使用DAX Studio等工具查看这些SQL查询。

请注意,在PowerBI中不必严格在表之间建立关系。您可以使用DAX(以编程方式)模仿相同的行为,但是这种“虚拟”关系更加复杂,并且速度可能会慢得多。

答案 1 :(得分:1)

在RM(关系模型)和ERM(实体关系模型)表中,表表示关系(船)/协会。因此,“ RM”中的关系和“ ERM”中的关系

在伪ERM方法中,

FK(外键)被错误地称为“关系”。 SQL FK约束表示子行在其他地方显示为PK(主键)或UNIQUE。 DBMS使用它们禁止无效更新并优化查询。

Power BI“关系”不是FK。它们是有关如何建立查询的说明。

有FK时,我们确实经常想加入它。因此,当有FK时,我们通常希望建立Power BI关系。

W3schools php tutorial
(另请参见开发人员的下载PDF链接。)

PS 我们不需要约束来声明或声明或知道其查询条件。这些约束(包括PK,FK,唯一性和基数)由表含义-(特征)谓词-以及可能发生的业务情况确定。如果约束成立,那么有时候我们得到的行数会比其他情况少,并且某些查询对总是返回相同的结果,否则它们将不会返回。

Create and manage relationships in Power BI Desktop
Foreign keys are not needed to join tables!

PS 交叉联接是内部联接,其条件为TRUE(某些DBMS中为无条件)。 FK是否存在“关系”也无关紧要。如果条件为FK = PK或TRUE以外的其他值,则它不是交叉联接;否则,表之间是否存在FK,这是交叉联接。只是我们经常希望条件中的PK = FK并且工具可以并且确实将FK的存在用于默认条件。

Is there any rule of thumb to construct SQL query from a human-readable description?

答案 2 :(得分:1)

您问“引擎盖下发生了什么?” 简单的答案是“关于关系的 声明 。”

善意的人们绘制了ER图,似乎忘记或不知道他们的ER图实际上是“语言陈述的图片”。

问题是模棱两可。

很多意思是人们在不表达其ER图所基于的逻辑陈述的情况下直接跳到ER图。实际上,这意味着绘制ER图的人似乎期望ER图的“读者”将能够重构从中绘制ER图的语句。

这里是一个例子来说明我的意思。我的目的是展示学生与其住所之间“隐蔽”关系的语言学基础。

所以,隐藏的是语言!

一个简单的图 ER Diagram 1

从中派生图的语句。 The statements

更复杂的图

Student lives at Address

从中导出图的语句。

enter image description here