精华内容
下载资源
问答
  • 2019-04-16 14:11:28

    1. 主键

    主键是关系表中记录的唯一标识。
    主键的选取:主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL

    idclass_idnameother columns…
    11小明
    21小红
    52小白

    2. 外键

    students表中,通过class_id的字段,可以把数据与另一张表关联起来,这种列称为外键

    外键并不是通过列名实现的,而是通过定义外键约束实现的:

    ALTER TABLE students
    ADD CONSTRAINT fk_class_id
    FOREIGN KEY (class_id)
    REFERENCES classes (id);
    

    其中,外键约束的名称fk_class_id可以任意,FOREIGN KEY (class_id)指定了class_id作为外键,REFERENCES classes (id)指定了这个外键将关联到classes表的id列(即classes表的主键)。

    通过定义外键约束,关系数据库可以保证无法插入无效的数据。即如果classes表不存在id=99的记录,students表就无法插入class_id=99的记录。

    由于外键约束会降低数据库的性能,大部分互联网应用程序为了追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。这种情况下,class_id仅仅是一个普通的列,只是它起到了外键的作用而已。

    要删除一个外键约束,也是通过ALTER TABLE实现的:

    ALTER TABLE students
    DROP FOREIGN KEY fk_class_id;
    

    注意:删除外键约束并没有删除外键这一列。删除列是通过DROP COLUMN ...实现的。

    3. 索引

    经常根据score列进行查询,就可以对score列创建索引:

    ALTER TABLE students
    ADD INDEX idx_score (score);
    

    使用ADD INDEX idx_score (score)就创建了一个名称为idx_score,使用列score的索引。索引名称是任意的,索引如果有多列,可以在括号里依次写上,例如:

    ALTER TABLE students
    ADD INDEX idx_name_score (name, score);
    

    3.1 唯一索引

    在设计关系数据表的时候,看上去唯一的列,例如身份证号、邮箱地址等,因为他们具有业务含义,因此不宜作为主键。

    但是,这些列根据业务要求,又具有唯一性约束:即不能出现两条记录存储了同一个身份证号。这个时候,就可以给该列添加一个唯一索引。例如,我们假设students表的name不能重复:

    ALTER TABLE students
    ADD UNIQUE INDEX uni_name (name);
    

    通过UNIQUE关键字我们就添加了一个唯一索引。

    也可以只对某一列添加一个唯一约束而不创建唯一索引:

    ALTER TABLE students
    ADD CONSTRAINT uni_name UNIQUE (name);
    

    这种情况下,name列没有索引,但仍然具有唯一性保证。

    无论是否创建索引,对于用户和应用程序来说,使用关系数据库不会有任何区别。这里的意思是说,当我们在数据库中查询时,如果有相应的索引可用,数据库系统就会自动使用索引来提高查询效率,如果没有索引,查询也能正常执行,只是速度会变慢。因此,索引可以在使用数据库的过程中逐步优化。

    更多相关内容
  • 如何在SQL Server创建SQL依赖关系

    千次阅读 2020-07-22 13:47:22
    在SQL Server,有几种查找对象依赖关系和创建SQL依赖关系跟踪器的方法。 The sp_depends system stored procedure sp_depends系统存储过程 sys.dm_sql_referencing_entities sys.dm_sql_referencing_entities sys...

    Deleting or changing objects may affect other database objects like views or procedures that depends on them and in certain instances, can “break” the depending object. An example can be that if a View queries a table and the name of that table changes. The View will no longer function.

    删除或更改对象可能会影响其他数据库对象,例如依赖于它们的视图或过程,并且在某些情况下可能会“破坏”依赖的对象。 一个示例可以是,如果View查询一个表,并且该表的名称发生更改。 视图将不再起作用。

    To understand the interdependencies of our database it is very helpful to see and analyze these dependencies in a SQL Server dependency tree, and ultimately to even create a SQL dependency diagram visually displaying the hierarchical relationships

    要了解我们数据库的相互依赖性,在SQL Server依赖性树中查看和分析这些依赖性非常有帮助,最终甚至可以创建可视化显示层次关系SQL依赖性图。

    In SQL Server there are several ways to find object dependencies and create a SQL dependency tracker.

    在SQL Server中,有几种查找对象依赖关系和创建SQL依赖关系跟踪器的方法。

    1. The sp_depends system stored procedure

      sp_depends系统存储过程
      • sys.dm_sql_referencing_entities

        sys.dm_sql_referencing_entities
      • sys.dm_sql_referenced_entities

        sys.dm_sql_referenced_entities
    2. The View Dependencies feature in SQL Server Management Studio (SSMS)

      SQL Server Management Studio(SSMS)中的“视图依赖项”功能

    sp_depends (sp_depends )

    sp_depends is a system stored procedure that displays information about all object types (e.g. procedures, tables, etc) that depend on the object specified in the input parameter as well as all objects that the specified object depends on.

    sp_depends是一个系统存储过程,它显示有关所有对象类型(例如,过程,表等)的信息,这些对象类型取决于输入参数中指定的对象以及指定对象所依赖的所有对象。

    The sp_depends procedure accepts one parameter, the name of a database object. E.g. EXECUTE sp_depends ‘ObjectName’

    sp_depends过程接受一个参数,即数据库对象的名称。 例如EXECUTE sp_depends'ObjectName '

    Below are examples, which will be used in this article:

    下面是示例,将在本文中使用:

    -- New database
    CREATE DATABASE TestDB;
    GO
     
    USE TestDB
    GO
     
    CREATE TABLE UserAddress (
    	AddresID INT PRIMARY KEY IDENTITY(1, 1)
    	,FirstName VARCHAR(100)
    	,Lastname VARCHAR(150)
    	,Address VARCHAR(250)
    	)
    GO
     
    -- New procedure
    CREATE PROCEDURE sp_GetUserAddress
    AS
    BEGIN
    	SELECT FirstName
    		,Lastname
    		,Address
    	FROM UserAddress
    END
    GO
     
    CREATE TABLE Address (
    	ID INT NOT NULL IDENTITY(1, 1)
    	,City VARCHAR(120)
    	,PostalCode INT
    	,UserAddressID INT FOREIGN KEY REFERENCES UserAddress(AddresID)
    	)
    GO
    -- New View
    CREATE VIEW v_Address
    AS
    SELECT ID
    	,City
    	,PostalCode
    	,UserAddressID
    FROM dbo.Address
    GO
     
    CREATE PROCEDURE sp_GetUserCity
    AS
    BEGIN
    	SELECT UserAddress.FirstName
    		,UserAddress.Lastname
    		,Address.City
    	FROM UserAddress
    	INNER JOIN Address ON UserAddress.AddresID = Address.UserAddressID
    END
    GO
    -- New Trigger
    CREATE TRIGGER trgAfterInsert ON [dbo].[UserAddress]
    FOR INSERT
    AS
    PRINT 'Data entered successfully'
    GO
    

    Let’s run these scripts above to create the test objects then execute the following SQL.

    让我们在上面运行这些脚本来创建测试对象,然后执行以下SQL。

    EXECUTE sp_depends 'UserAddress'
    

    The following result will be:

    结果如下:

    name type
    1 dbo.sp_GetUserAddress stored procedure
    2 dbo.sp_GetUserCity stored procedure
    名称 类型
    1个 dbo.sp_GetUserAddress 存储过程
    2 dbo.sp_GetUserCity 存储过程
    • name – name of dependent object 名称 –依赖对象的名称
    • type类型 type of dependent object (e.g. table) 依赖对象的类型(例如表)

    If a stored procedure is specified as an argument value in sp_depends, then a name of the table and the column names on which the procedure depends will be shown.

    如果将存储过程指定为sp_depends中的参数值则将显示该过程所依赖的表名和列名。

    Let’s see how this looks with sp_GetUserAddress

    让我们看一下sp_GetUserAddress的外观

    EXECUTE sp_depends 'sp_GetUserAddress'
    

    The following result will be:

    结果如下:

    name type updated selected column
    1 dbo.UserAddress user table no yes FirstName
    2 dbo.UserAddress user table no yes LastName
    3 dbo.UserAddress user table no yes Addresss
    名称 类型 更新 已选
    1个 dbo.UserAddress 用户表 没有 名字
    2 dbo.UserAddress 用户表 没有
    3 dbo.UserAddress 用户表 没有 地址
    • name – name of dependent object名称 –依赖对象的名称
    • type – type of dependet object (e.g. table) 类型 –依赖对象的类型(例如表)
    • updated – whether the object is updated or not 已更新 –对象是否已更新
    • selected – object is used in the SELECT statement selected –在SELECT语句中使用对象
    • column – column on which the dependency exists column –依赖项所在的列

    sp_depends does not display triggers.

    sp_depends不显示触发器。

    To illustrate this, execute the following code in the query window:

    为了说明这一点,请在查询窗口中执行以下代码:

    CREATE TRIGGER trgAfterInsert ON [dbo].[UserAddress]
    FOR INSERT
    AS
    PRINT 'Data entered successfully'
    GO
    

    Now execute the sp_depends over the UserAddress table, the trgAfterInsert will not appear in the Results table:

    现在,在UserAddress表上执行sp_dependstrgAfterInsert将不会出现在Results表中:

    name type
    1 dbo.sp_GetUserAddress stored procedure
    2 dbo.sp_GetUserCity stored procedure
    名称 类型
    1个 dbo.sp_GetUserAddress 存储过程
    2 dbo.sp_GetUserCity 存储过程

    sp_dependes in some case does not report dependencies correctly. Let’s look at the situation when an object (e.g. UserAddress) on which another object depends (e.g. sp_GetUserAddress) is deleted and recreated. When sp_dependes is executed using EXECUTE sp_depends ‘sp_GetUserAddress’ or EXECUTE sp_depends ‘UserAddress’ the following message will appear:

    在某些情况下, sp_dependes无法正确报告依赖关系。 让我们看看当一个物体(如UserAddress)另一对象取决于形势(如sp_GetUserAddress)被删除并重新创建。 当使用的sp_depends EXECUTE“sp_GetUserAddress”EXECUTE sp_depends将“UserAddress”执行sp_dependes将出现以下消息:

    Sadly, sp_dependes is on the path to deprecation and will be removed from future versions of the SQL Server. But you can use sys.dm_sql_referencing_entities and sys.dm_sql_referenced_entities instead.

    遗憾的是, sp_dependes即将弃用,并且将从SQL Server的未来版本中删除。 但是您可以改用sys.dm_sql_referencing_entitiessys.dm_sql_referenced_entities

    sys.dm_sql_referencing_entities

    sys.dm_sql_referencing_entities

    This function returns all objects from the current database which depend on the object that is specified as an argument.

    此函数从当前数据库返回所有对象,这些对象取决于指定为参数的对象。

    SELECT referencing_schema_name
    	,referencing_entity_name
    FROM sys.dm_sql_referencing_entities('dbo.UserAddress', 'Object')
    

    The result will be:

    结果将是:

    referencing_schema_name referencing_entity_name
    1 dbo sp_GetUserAddress
    2 dbo sp_GetUserCity
    referenceencing_schema_name referenceencing_entity_name
    1个 dbo sp_GetUserAddress
    2 dbo sp_GetUserCity

    referencing_schema_name – schema of the referencing entity

    referencing_schema_name –引用实体的架构

    referencing_entity_name – name of the referencing object

    referencing_entity_name –引用对象的名称

    More information about result sets can be found on this link.

    关于结果集的更多信息可以在此链接上找到。

    sys.dm_sql_referenced_entities

    sys.dm_sql_referenced_entities

    This system function returns all objects from the current database on which specified object depends on.

    该系统函数从当前数据库返回指定对象所依赖的所有对象。

    Enter the following code in the query window:

    在查询窗口中输入以下代码:

    SELECT referenced_entity_name
    	,referenced_minor_name
    FROM sys.dm_sql_referenced_entities('dbo.sp_GetUserAddress', 'Object')
    

    The following result will be shown:

    将显示以下结果:

    referenced_entity_name referenced_minor_name
    1 UserAddress NULL
    2 UserAddress FirstName
    3 UserAddress Lastname
    4 UserAddress Address
    referenced_entity_name referenced_minor_name
    1个 用户地址 空值
    2 用户地址 名字
    3 用户地址
    4 用户地址 地址

    referenced_entity_name – Name of the referenced object

    referenced_entity_name –引用对象的名称

    referenced_minor_name – Name of the column of the referenced entity

    referenced_minor_name –被引用实体的列名

    For detailed information about result sets, please visit page on this link.

    有关结果集的详细信息,请访问此链接上的页面

    引用与引用 (Referencing vs referenced)

    The objects that are appears inside the SQL expression are called the referenced entity and the objects which contain expressions are called referencing entity:

    SQL表达式内出现的对象称为引用实体,而包含表达式的对象称为引用实体:

    When using these two function the schema name (e.g. dbo) must be specified as part of the object name:

    使用这两个函数时,必须将模式名称(例如dbo )指定为对象名称的一部分:

    SELECT referencing_schema_name
    	,referencing_entity_name
    FROM sys.dm_sql_referencing_entities('dbo.UserAddress', 'Object')
    

    Otherwise no results will be displayed. Run the query without shema nema (dbo):

    否则,将不会显示任何结果。 在不使用shema nema(dbo)的情况下运行查询:

    SELECT referencing_schema_name
    	,referencing_entity_name
    FROM sys.dm_sql_referencing_entities('UserAddress', 'Object')
    

    The result will be empty set:

    结果将为空集:

    referencing_schema_name referencing_entity_name
     
    referenceencing_schema_name referenceencing_entity_name

    An empty result set will be shown under these situations:

    在以下情况下将显示空结果集:

    • ‘dbo.UserAddress’,’NN’ 'dbo.UserAddress','NN'dbo.UserAddress’,’Object’dbo.UserAddress','Object'
    • sys.all_columns) sys.all_columns
    • When the specified object does not reference any objects

      当指定的对象未引用任何对象时
    • The specified object does not exist in the current database

      指定的对象在当前数据库中不存在

    消息2020 (The message 2020 )

    Typically, the message 2020 occurs when a referencing object e.g. procedure, calls a referenced object e.g. table or a column from the table that does not exist. For example, if in the Address table change name of the column City to name Town and execute the SELECT * FROM sys.dm_sql_referenced_entities (‘[dbo].[v_Address]’,’Object’) query, the message 2020 will appear.

    通常,消息2020在引用对象(例如过程)调用引用对象(例如表或表中不存在的列)时发生。 例如,如果在“ 地址”表中将“ 城市 ”列的名称更改为“ 城市”并执行SELECT * FROM sys.dm_sql_referenced_entities('[dbo]。[v_Address]','Object')查询,则会出现消息2020。

    Execute the following code:

    执行以下代码:

    EXEC sys.sp_rename 'dbo.Address.City'
    	,'Town'
    	,'COLUMN'
     
    SELECT *
    FROM sys.dm_sql_referenced_entities('dbo.v_Address', 'OBJECT')
    

    The following message will appear:

    将显示以下消息:


    Msg 207, Level 16, State 1, Procedure v_Address, Line 6
    Invalid column name ‘City’.
    Msg 2020, Level 16, State 1, Line 3 The dependencies reported for entity “dbo.v_Address” might not include references to all columns. This is either because the entity references an object that does not exist or because of an error in one or more statements in the entity. Before rerunning the query, ensure that there are no errors in the entity and that all objects referenced by the entity exist.


    消息207,级别16,状态1,过程v_Address,第6行
    无效的列名“城市”。
    消息2020,级别16,状态1,第3行实体“ dbo.v_Address”报告的依赖项可能未包括对所有列的引用。 这是因为该实体引用了一个不存在的对象,或者是由于该实体中的一个或多个语句中的错误。 重新运行查询之前,请确保该实体中没有错误,并且该实体引用的所有对象都存在。

    故障排除 (Troubleshooting )

    In order to prevent dropping or modifying objects, which depends on another object, the v_Address view should be altered and added the WITH SCHEMABINDING option:

    为了防止丢弃或修改依赖于另一个对象的对象,应更改v_Address视图并添加WITH SCHEMABINDING选项:

    ALTER VIEW v_Address
    	WITH SCHEMABINDING
    AS
    SELECT ID
    	,City
    	,PostalCode
    	,UserAddressID
    FROM dbo.Address
    

    Now, when changing the name of the column in the Address table, the following message will appear, which proactively provides information that the object, the table “City” in this example, is a part of another object.

    现在,当更改“ 地址”表中的列名称时,将出现以下消息,该消息主动提供信息,即对象(在此示例中为“城市”)是另一个对象的一部分。

    Code:

    码:

    EXEC sys.sp_rename 'dbo.Address.City'
    	,'Town'
    	,'COLUMN'
    

    Message:

    信息:

    Msg 15336, Level 16, State 1, Procedure sp_rename, Line 501
    Object ‘dbo.Address.City’ cannot be renamed because the object participates in enforced dependencies.

    消息15336,级别16,状态1,过程sp_rename,第501行
    无法重命名对象“ dbo.Address.City”,因为该对象参与了强制性依赖关系。

    架构绑定与非架构绑定 (Schema-bound vs Non-schema-bound)

    There are two types of dependencies: Schema-bound and Non-schema-bound dependencies.

    有两种类型的依赖关系:架构绑定的和非架构绑定的依赖。

    A Schema-bound dependency (SCHEMABINDING) prevents referenced objects from being altered or dropped as long as the referencing object exists

    绑定模式的依赖关系(SCHEMABINDING)防止只要存在引用对象,就可以更改或删除引用的对象

    A Non-schema-bound dependency: does not prevent the referenced object from being altered or dropped.

    非模式绑定的依赖项 :不会阻止所引用的对象被更改或删除。

    For sys.dm_sql_referenced_entities and sys.dm_sql_referencing_entities dependency information will not be displayed for temporary tables, temporary stored procedures or system objects.

    对于sys.dm_sql_referenced_entitiessys.dm_sql_referencing_entities,将不会显示临时表,临时存储过程或系统对象的依赖项信息。

    Below is an example of a temporary procedure:

    下面是一个临时过程的示例:

    CREATE PROCEDURE #sp_tempData
    AS
    BEGIN
    	SELECT AddresID
    		,FirstName
    		,Lastname
    		,Address
    	FROM UserAddress
    END
    

    Now, when executing sys.dm_sql_referencing_entities for the table UserAddress the information about the #sp_tempData procedure that depends on the UserAddress will not be shown in the list.

    现在,当执行sys.dm_sql_referencing_entities时 为表UserAddress有关依赖于UserAddress#sp_tempData过程中的信息将不会在列表中显示。

    Code:

    码:

    SELECT referencing_schema_name
    	,referencing_entity_name
    FROM sys.dm_sql_referencing_entities('dbo.UserAddress', 'Object')
    

    Result:

    结果:

    referencing_schema_name referencing_entity_name
    1 dbo sp_GetUserAddress
    2 dbo sp_GetUserCity
    referenceencing_schema_name referenceencing_entity_name
    1个 dbo sp_GetUserAddress
    2 dbo sp_GetUserCity

    查看依赖关系 (Viewing Dependencies)

    Another way to view dependencies between objects, but to create a visual SQL dependency tracker, is by using the View Dependencies option from SSMS. From the Object Explorer pane, right click on the object and from the context menu, select the View Dependencies option:

    查看对象之间的依赖关系但创建可视SQL依赖关系跟踪器的另一种方法是使用SSMS中的“ 查看依赖关系”选项。 在“ 对象资源管理器”窗格中,右键单击对象,然后从上下文菜单中选择“ 视图依赖项”选项:

    This will open the Object Dependencies window. By default, the Object that depend on radio button is selected. This radio button will list in the Dependencies section all objects that depends on the selected object (e.g. Address):

    这将打开“ 对象依赖关系”窗口。 默认情况下, 依赖单选按钮的对象处于选中状态。 此单选按钮将在Dependencies部分中列出所有依赖于所选对象的对象(例如Address ):

    If selected the Object on which radio button, will display in the Dependencies section all objects on which selected object (e.g. Address) depends:

    如果选中了对象所在的单选按钮,将在“ 依赖关系”部分中显示所选对象(例如Address )所依赖的所有对象:

    The Selected object section consists of three fields:

    选定对象部分包括三个字段:

    • Name – name of the selected object from the 名称 -从Dependencies list 相关性列表中选择的对象的名称
    • Type – type of the selected object (e.g.table) 类型 –所选对象的类型(例如)
    • Dependency type – dependency between two objects (Schema-bound, Non-schema-bound). 依赖关系类型 –两个对象之间的依赖关系(架构绑定,非架构绑定)。

    Under the Type field the Unresolved Entity type for the object can be appear. This happens when the objects refer to an object that don’t exist in the database. This is equivalent to the Msg 2020 message that appears when using sys.dm_sql_referencing_entities or sys.dm_sql_referenced_entities functions:

    在“ 类型”字段下,可以显示对象的“ 未解析实体”类型。 当对象引用数据库中不存在的对象时,就会发生这种情况。 这等效于使用sys.dm_sql_referencing_entitiessys.dm_sql_referenced_entities函数时出现的Msg 2020消息:

    This SQL dependency tracker is kind of a poor man’s SQL dependency diagram, in that it doesn’t show cross relationships or offer many value added features, but it will give you a quick preview of the dependences in the hierarchy that contains a particular object

    该SQL依赖关系跟踪器有点像穷人SQL依赖关系图,因为它不显示交叉关系或提供许多增值功能,但是它将为您提供包含特定对象的层次结构中的依赖关系的快速预览。

    备择方案 (Alternatives)

    ApexSQL Analyze is a 3rd party tool that can analyzes graphical SQL Server database object dependencies and the impact of potential deletions on your SQL database and create a SQL dependency diagram. It determines object interrelationships within the database, and allows customization of the resulting SQL dependency diagram appearance.

    ApexSQL分析是一个第三方的工具,可以分析图形SQL Server数据库对象依赖性和潜在的缺失你SQL数据库的影响,并创建一个SQL依赖关系图。 它确定数据库内的对象相互关系,并允许自定义结果SQL依赖图外观。

    The tool can be downloaded from SQL tools downloads.

    该工具可以从SQL工具下载中下载

    To see object dependencies, on the Home tab, click the New button, under the Connection to SQL Server window, choose the SQL Server instance, pick the type of authentication, and after selecting a desired database in the Database drop-down box, click the Connect button:

    若要查看对象依赖性,请在“ 主页”选项卡上,单击“ 新建”按钮,在“ 连接到SQL Server”窗口下,选择SQL Server实例,选择身份验证的类型,然后在“ 数据库”下拉框中选择所需的数据库后,单击“确定”。 连接按钮:

    The Dependency viewer window will appear:

    将显示“ 依赖关系查看器”窗口:

    with the Dependencies pane, which shows all objects that depends on the selected object (e.g. UserAddress), by default this pane appears on the right side of the Dependency viewer window:

    使用“ 依赖关系”窗格该窗格显示了依赖于所选对象的所有对象(例如UserAddress ),默认情况下,此窗格显示在“ 依赖关系查看器”窗口的右侧:

    Dependency viewer provides graphical view of all dependencies between objects in the middle of the Dependency viewer window:

    依赖关系查看器在“ 依赖关系查看器”窗口的中间提供了对象之间所有依赖关系的图形视图:

    视觉依赖 (Visual dependencies)

    The Dependency viewer offers various options for filtering, appearance and manipulating objects.

    依赖关系查看器提供了用于过滤,显示和操纵对象的各种选项。

    In the Object browser pane, the object types (e.g. view) that will be displayed in the dependency graph can be specified:

    在“ 对象浏览器”窗格中,可以指定将在依赖关系图中显示的对象类型(例如视图):

    Also, in the Object browser pane, specific objects can be selected that will be shown or omitted from the dependency graph:

    另外,在“ 对象浏览器”窗格中,可以选择特定对象,这些对象将在依赖关系图中显示或省略:

    The Dependencies pane, the complete dependency chain for the selected object in the dependency graph (e.g. Address) can be shown. Referencing indicate the object that depend on the selected object (aka referencing) and Referenced by shows the objects from which selected object depends on (aka referenced):

    依赖关系”窗格中,可以显示依赖关系图中所选对象的完整依赖链(例如Address )。 引用表示依赖于所选对象的对象(又称为引用),“ 引用者”显示所选对象所依赖的对象(又称为引用):

    Also, the dependency chain can be reviewed by selecting an object in the dependency graph (e.g. Address), right click and from the context menu under the Select sub-menu, choose Referencing objects or Referenced objects command:

    同样,可以通过在依赖关系图中选择一个对象(例如Address ),单击鼠标右键,然后从“ 选择”子菜单下的上下文菜单中,选择“ 引用对象”或“ 引用的对象”命令来查看依赖关系链:

    The Layout option under the Display ribbon offers different options for visual organization and display:

    显示”功能区下的“ 布局”选项为视觉组织和显示提供了不同的选项:

    For example, the Orthogonal option attempts to organize objects in the diagrams so that they are at right angles to each other. It is useful for quick identification of all objects related to a given object (i.e. both those that depend on it and those it depends on):

    例如,“ 正交”选项尝试组织图中的对象,以使它们彼此成直角。 对于快速识别与给定对象相关的所有对象(即,依赖于该对象的对象以及该对象所依赖的对象),这很有用:

    Using this option, it can easily be determined how many objects depend on a specific object and a determination can be made as to whether it is safe to delete it without breaking relationships

    使用此选项,可以轻松确定有多少对象依赖于特定对象,并且可以确定在不破坏关系的情况下删除该对象是否安全

    The Show columns option shows columns with datatypes of the tables and views objects:

    显示列选项显示具有表和视图对象的数据类型的列:

    Additionally, the definition of an object can be easily reviewed by selecting the desired object (e.g. Address table), right click and from the context menu, select the Show script command:

    此外,通过选择所需的对象(例如地址表),单击鼠标右键,然后从上下文菜单中选择“ 显示脚本”命令,可以轻松查看对象的定义:

    The script window will appear with definition of the selected object:

    将显示脚本窗口,其中包含所选对象的定义:

    In this article we discussed SQL Server object interdependencies, how to find them using SQL, SSMS and a 3rd party solution, and finally how to create a SQL dependency diagram from the results. Happy diagramming!

    在这篇文章中,我们讨论了SQL Server对象的相互依存关系,如何使用SQL,SSMS和第三方解决方案,最后如何创建一个找他们SQL依赖关系图从结果。 图解愉快!

    翻译自: https://www.sqlshack.com/how-to-create-a-sql-dependency-diagram-in-sql-server/

    展开全文
  • 数据库理论:关系代数与 SQL

    千次阅读 多人点赞 2021-01-13 23:29:44
    目录前言关系代数选择语句投影语句连接语句除法(重要⚠)关系代数例题SQL视图模式匹配聚合,分组与HAVING子查询SQL 例题 前言 关系代数通过符号化的语言,来描述数据库的行为关系,相当于简化版的 SQL。比如并,交...

    前言

    关系代数通过符号化的语言,来描述数据库的行为关系,相当于简化版的 SQL。比如并,交,差,笛卡尔积,除法,select 语句等等。

    SQL 则是结构化查询语句,相比于关系代数,更方便被计算机识别的一种查询语言。


    其余的复习笔记:

    数据库理论:函数式依赖,无损拆分,依赖保留拆分与数据库范式

    数据库理论:ER模型,关系转换,并发控制与冲突可串行化调度

    关系代数

    交,并,差,笛卡尔积等符号,和数学上的符号完全一致,只是运算的单位不是集合而是表。

    交运算取两张表相同的字段。并运算类似,也是合并相同的字段,同时加入不相同的字段:

    在这里插入图片描述
    差运算则是减去两者的交集。笛卡尔积则组合任意的属性:
    在这里插入图片描述

    选择语句

    关系代数中用符号 σ(西格玛,sigma)来描述选择语句。此外我们可以在 select 的同时,添加限制条件(即 where),使用例如下:

    σ 选 择 条 件 ( 数 据 表 名 称 ) \sigma_{选择条件}(数据表名称) σ()

    比如:
    σ A G E = 19 ( s t u d e n t ) \sigma_{AGE=19}(student) σAGE=19(student)

    就等价于:

    select * from student where AGE=19;
    

    投影语句

    在关系代数中的投影语句相当于 SQL 中的字段筛选,可以选择特定的字段进行查询,格式如下:

    π 属 性 ( 表 名 ) \pi_{属性}(表名) π()

    比如:

    π s n o ,   a g e ,   s n a m e ( s t u d e n t ) \pi_{sno, \ age, \ sname}(student) πsno, age, sname(student)

    就等价于:

    select sno, age, sname from student;
    

    此外,投影语句也可以和选择语句的 where 联动:

    π s n a m e ( σ A G E = 19 ( s t u d e n t ) ) \pi_{sname}(\sigma_{AGE=19}(student)) πsname(σAGE=19(student))

    就相当于一个完整的 select 语句:

    select sname from student where AGE=19;
    

    连接语句

    关于连接的 SQL 版本,可以看我之前的博客:MySQL 连接(JOIN)使用 简单讲解与示例

    关系代数版本的连接语句如下,假设有两张表 R 和 S,通过某些条件把他们进行连接,用 ∞ 号表示连接:

    R   ∞ 连 接 条 件   S R \ \infty_{连接条件} \ S R  S

    这相当于先将两张表取笛卡尔积,再根据连接条件从中进行筛选:

    R   ∞ 连 接 条 件   S ↔ σ 连 接 条 件 ( R × S ) R \ \infty_{连接条件} \ S \leftrightarrow \sigma_{连接条件}(R \times S) R  Sσ(R×S)

    一般连接中都认为连接条件是带有等号的(比如外键),这种连接叫做等号连接。通常可以省略连接条件。能够省略的又称为 “自然连接” (natural join)

    在这里插入图片描述

    外连接则是在内连接的基础上,为无法匹配的记录 添加空行

    在这里插入图片描述

    除法(重要⚠)

    除法是乘法(笛卡尔积 )的逆运算,值得注意的是,关系代数中除法只为整除

    只有当除表的所有记录,在被除表中全部命中时,才认为发生了整除。如下图,当 A 表中某几条记录完全被 B 完成命中时,才认为发生整除,其他部分都不算整除。

    下图颜色三个除法例子。可以用 A÷B 再 × B,就能得到下图的颜色标记部分:

    在这里插入图片描述

    除法常用作选取带有 ALL 字眼的题目,比如选取选了所有课程的学生,那么用课程表去(course)除选课记录表(SC),就能得有选了所有课程的学生:

    在这里插入图片描述

    关系代数例题

    假设有三张表:

    1. 供应商 supplier,S
    2. 产品 product,P
    3. 购买记录 SP

    有如下的四个例题,题干和答案,分析如下:
    在这里插入图片描述

    第一题比较简单,直接连接一次即可。

    第二题需要连接两次。第一次连接找出 SP 表中所有 color=red 的记录,第二次连接找出这些记录对应的 supplier 的 sname

    第三题先利用 SP÷P 找出所有 supply 了所有 parts(products)的 supplier 的 #S(即 sid),然后再和 S 表连接,找出 sname

    第四题题干比较绕,就是找出一些供应商,他们买了所有【供应商 S2 购买的产品】,结合题目的表来看,S2 买了 P1,P2。于是我们要找出所有也同时买了 P1,P2 的供应商。

    注:
    这里其实我根本没有看懂题干,是通过关系代数表达式反推的题目。。。
    不得不吐槽巴斯克桑的英语咖喱味太浓了,或者说我的英语太种花
    至今不明白学校为何不用中文 ppt
    OTL

    SQL

    没啥特别的,真不熟

    就是提几点比较冷门或者比较难的:

    视图

    创建视图允许用户访问一个表的部分,方便管理权限,有着管中窥豹的作用。视图可以看作一张 “虚表”。

    通过 create 语句可以创建视图,视图的创建基于 select 语句,选择某些属性暴露在外:

    在这里插入图片描述

    模式匹配

    通过 LIKE 子句,在 where 中使用 like 来进行模式匹配,进而进行筛选。其中:

    1. % 号能够匹配任意字符串,包括空串
    2. _ 号能够匹配单个字符

    是不是有点像 leetcode 的某一题模式匹配?

    在这里插入图片描述

    聚合,分组与HAVING

    聚合函数通常计算某一群记录的聚合值,比如平均数。常用的有:

    • COUNT:计数
    • AVG:平均
    • MAX:极大
    • MIN:极小
    • SUM:求和

    比如计算每个月 A 产品的平均售价:

    select AVG(售价) from 数据表
    where 产品id=A
    

    那么最终结果只会返回一行,就是均值!

    聚合函数会将所有记录都压缩为一条记录。而分组(group by)则允许我们拆分这些聚合的过程,或者说是分组聚合。

    比如按照月份分组,计算每个月 A 产品的平均售价,那么有:

    select AVG(售价) from 数据表
    where 产品id=A
    group by month
    

    where 子句在分组(group by)之前进行筛选,而 having 子句则可以在分组之后进行筛选。

    还是以上面的例子为拓展,比如按照月份分组,计算每个月 A 产品的平均售价。此外,我们只需要 5 月份以后的数据,那么有:

    select AVG(售价) from 数据表
    where 产品id=A
    group by month
    having month>=5
    

    having 的用途就很清晰了。因为聚合函数返回的记录不止一条(比如典型的按月 group by),having 负责在 group by 之后再次筛选结果。

    子查询

    嵌套的查询。类比于 c 语言的多层 for 循环。子查询返回一条记录,或者几条(那就是集合了)

    可以使用 IN,ANY,ALL 等关键字对子查询返回的集合进行判断。

    当返回一条记录时,我们可以利用等号来进行判断。比如查询所有和 BOB 一个部门的员工(通过部门 id,deptno 来判断):

    select * from employee
    where deptno=(
    	select deptno from employee where ename='BOB'
    	);
    

    而如果 BOB 不止一个,即子查询返回的是一个集合,那么我们使用 ANY 或者 ALL 来进行判断。

    如果有两个 BOB 在不同的部门 A,B 那么我们利用 ANY 子句,只要和任意一个 BOB 在同一个部门,不管是 A 还是 B,我们都选上:

    select * from employee
    where deptno = ANY (
    	select deptno from employee where ename='BOB'
    	);
    

    其中 ANY,SOME 都是只要命中一条即可返回 true,而 ALL 要求全部命中,否则返回 false。此外,exist 要求子查询返回的结果不为空集,not exist 则相反。

    比如查找所有成绩(gpa,绩点,分数)大于 A01 班级所有人的同学:

    select * from student
    where gpa > ALL (
    	select gpa from student where classNO='A01'
    );
    

    当前同学的 gpa 必须大于子查询返回的集合中的任意一个 gpa,否则查询失败。这表示我们通过二重循环进行查询。

    外循环枚举每个学生,内循环枚举所有 A01 班的学生,判断,翻译为 std c++ 代码大概长这样:

    struct STUDENT
    {
    	std::string sname;
    	std::string classNO;
    	float gpa;
    	...
    };
    
    std::vector<STUDENT> student;
    
    for(int i=0; i<student.size(); i++)
    {
    	float gpa = student[i].gpa;
    	for(int j=0; j<student.size(); j++)
    	{
    		if(student[j].classNO != "A01") continue;
    		if(gpa > student[j].gpa)
    			std::cout<<student[i]<<std::endl;	// 满足条件 输出当前学生
    	}
    }
    

    复杂度 n 方起步。所以子查询是非常消耗性能的,能不用就不用。

    SQL 例题

    生僻题,不用连接,用子查询。

    题①:找出选修全部课程的学生。思路是双重否定。先找出有缺课(即没有选修全部课程)的学生,然后再遍历所有学生,排除那些缺课的学生:
    在这里插入图片描述

    题②:假设学号为 2006002001 的学生选课的集合为 X,找出选修了 X 中所有课程的学生。思路和上一题类似,只是【全部课程】改为了【X 集合中的课程】,思路还是双重否定:

    select * from Student s
    where not exist (
    	select * from course c
    	where sid=2006002001
    	and not exist (
    		select * from sc
    		where s.sid=sc.sid
    		and c.cid=sc.cid
    	));
    

    这里就能体现关系代数的方便。直接一次除法就搞定了,不把那子查询干的碎碎的?

    展开全文
  • 数据:数据就是数据库存储的基本数据,比如学生的学号、学生的班级 数据库:存放数据的仓库 数据库管理系统:数据库软件,如MySQL、Oracle 数据库系统:数据库+数据库管理系统+应用程序+数据库管理员(大佬) 实体...

    原文指路:关系、关系模式、关系模型blablabla…

    数据:数据就是数据库中存储的基本数据,比如学生的学号、学生的班级
    数据库:存放数据的仓库
    数据库管理系统:数据库软件,如MySQL、Oracle
    数据库系统:数据库+数据库管理系统+应用程序+数据库管理员(大佬)

    实体:客观存在的对象,比如一个学生,一位老师
    属性:实体的特性,比如学生的学号、姓名、院系
    :可唯一标识实体的属性集。比如学号是学生的码,一个学号唯一标识一名学生。学号和课程号是成绩的码,因为学号和课程号唯一标识一门课程的成绩
    实体型:对实体的描述,比如学生(学号,姓名,院系)
    实体集:实体的集合
    联系:实体集之间的关系。一名学生对应一个寝室(一对一),一个院系对应多名学生(一对多),多位教师对应多名学生(多对多)

    关系:若干元组的集合->数据库表
    关系模式:对关系的描述称为关系模式,最后会详细描述 -> 表的标题
    关系模型:若干关系的集合 -> 数据库
    属性(关系):相对于前面的属性的意义,这里特指数据库表中的某列
    元组:一条数据库记录
    分量:元组中某一属性值
    :一组具有相同数据类型的值的集合,是属性的取值范围,比如性别属性的域就是{男,女},学生学历属性的域就是{学士、硕士、博士、院士}

    候选码:可唯一标识某一元组的属性组,属性组中各个属性缺一不可。【t_student】(学号,姓名,学院),姓名可能会重复,所以其中学号可以唯一标识一条记录,学号就是t_student的候选码。那么假设姓名不会重复,那么候选码就有学号和姓名两个。 又比如【t_grade】(学号,课程,成绩),其中一个学生可以有多条成绩记录,所以需要学号和课程号组合才可以唯一标识一条数据库记录,所以学号、课程号就是t_student的一个候选码。
    超码:只要一个属性组可以唯一标识一个元组,那么就说这个属性组是超码 【t_student】(学号,姓名,学院),姓名可能会重复,所以(学号)是一个超码同时也是候选码,(学号,姓名)可唯一标识一个元组,所以其也是超码,但不是候选码,因为少了姓名也可以唯一标识。
    主属性:候选码中的属性称为主属性。【t_student】(学号,姓名,学院),学号就是主属性
    非主属性:不是主属性就是非主属性呗。【t_student】(学号,姓名,学院),姓名、学院就是非主属性
    全码:极端情况下表的所有属性组成该表的候选码,则称为全码
    主键/主码:primary key,一个表可能有多个候选码,往往选中一个作为主键
    外键/外码:foreign key,假设表A的某个属性attr是另一表B中的主码,且A和B有某种联系,则称attr是外码
    参照表:外码所在的表
    被参照表:外码所引用(foreign key references)的表
    数据完整性:数据完整性就是指数据的正确性和相容性(符合逻辑),又分为实体完整性、参照完整性、用户自定义完整性
    实体完整性:主码唯一且不为空
    参照完整性:不允许引用不存在的实体。参照表插入某条记录,这条记录的外码在被参照表中必须存在
    用户自定义完整性:由用户自定义的数据约束。比如性别只能用男、女表示,人的年龄在0-120之间。常见的用户自定义完整性有NOT NULL,UNIQUE,CHECK等

    内模式:对数据库的物理存储结构和存储方式的描述,是数据库在数据库内部的存储方式。拿MySQL来讲,每建一个表,都会在文件系统上生成一个或多个文件,这些文件存储了数据、表信息、索引信息,这就称为内模式
    模式:对内模式的抽象,即数据库
    外模式:对模式的抽象,即用户直接使用的应用程序
    外模式-模式映像:保证数据的逻辑独立性。当模式改变时(增加表,增加表的结构),可以保证外模式不变
    模式-内模式映像:保证数据的物理独立性。当内模式改变时(比如MySQL切换了存储引擎),可以保证模式不变,从而外模式也不会变。

    关系模式
    关系模式是对关系的描述(有哪些属性,各个属性之间的依赖关系如何),模式的一个具体值称为模式的一个实例。模式反应是数据的结构及其联系,是型,是相对稳定的,实例反应的是关系某一时刻的状态,是值,是相对变动的。
    想要查看t_student的关系模式?DESC t_student
    想要查看t_student的关系实例?SELECT * FROM student
    另外,关系模式有约定的数学表示,R(U,D,DOM,F),R指关系名,U指一组属性,D指域,DOM指属性到域的映射,F就是指数据依赖。举个栗子,假设一个学生表t_student,拥有属性学号,姓名,性别,学院,其数学表示如图。
    在这里插入图片描述

    展开全文
  • SQL要求您使用之前使用预定义模式来确定数据的结构。此外,您的所有数据都必须遵循相同的结构。这可能需要大量的前期准备,这意味着结构的变化既困难又对整个系统造成破坏。 NoSQL数据库具有非结构化数据的动态...
  • 数据库关系模式的范式总结

    千次阅读 多人点赞 2019-04-25 21:21:01
    目录 什么是关系模式的范式 第一范式(1NF) 第二范式(2NF) ...关系模式的范式是衡量关系模式好坏的标准。范式的种类与数据依赖有着直接联系,满足不同程度要求的关系称为不同的范式等级。其中,...
  • 关系型数据库的模式

    千次阅读 2017-12-26 14:25:39
    一、SQL语言支持关系数据库的三级模式结构,分别是模式、外模式和内模式。 二、分别介绍:  1、模式:所有基本表构成了数据库的模式,也叫关系模式。...1、在SQL中,对应的名称:  (1) 关系模式
  • 模式在SQL Server中称为架构,一个模式下通常包括了多个表、视图和索引等数据库对象。模式授权于用户,用户被授权某个模式,相当于被授权使用数据库模式下数据的权利 新建用户时,需要指定登录名,浏览(…...
  • 第三章 关系数据库标准语言SQL

    千次阅读 2021-04-17 09:51:00
    SQL(Structured Query Language),结构化查询语言,是关系数据库的标准语言。 SQL是一个通用的、功能极强的关系数据库语言 1.SQL标准的进展过程 标准 大致页数 发布日期 SQL/86 1986.10 SQL/89(FIPS ...
  • 前言: 使用SQL语言时,要注意SQL语言对大小写并不敏感,一般使用...CREATE SCHEMA可以接受CREATE TABLE,CREATE VIEW和GRANT子句,语句如下: CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<...
  • 关系模式(1)什么是关系模式(2)定义关系模式3.关系模式和关系的对比4.关系数据库 0.思维导图 1. 关系 什么是关系? 单一的数据结构----关系 现实世界的实体以及实体间的各种联系均用关系来表示 逻辑结构----二...
  • 关系数据库标准语言SQL 一、SQL概述 1.SQL的特点 SQL是因为它是一个综合的、功能极强同时又简洁易学的语言。SQL集数据查询(dataquery)、数据操纵(datamanipulation)、 数据定义(data definition) 和数据控制(data...
  • SQL数据库——关系代数(一)及解题套路

    千次阅读 多人点赞 2020-02-28 15:51:35
    关系模型的数据结构非常简单,只包含单一的数据结构——关系用户看来,关系模型数据的逻辑结构是一张扁平的二维表。
  • 数据库系统的内部体系结构数据库的三级模式结构模式模式模式数据库系统的二级映像与数据的独立性外模式/模式映像模式/内模式映像数据库系统的三级模式和二级映像的优点 ...模式称为逻辑模式或者...
  • sql – 如何数据库表示继承

    千次阅读 2019-01-14 10:45:23
    我正在考虑如何在SQL Server数据库表示复杂的结构。   考虑一个应用程序需要存储一系列对象的详细信息,这些对象共享一些属性,但有许多其他的不常见。例如,商业保险包可能包括同一政策记录的责任,汽车,...
  • 数据库:第二章 《关系模式》概念总结

    千次阅读 多人点赞 2020-03-31 11:27:37
    1. 关系模式的相关概念: 域: 域是一组具有相同数据类型的值的集合 笛卡尔积: 域上的一种集合运算 其中每一个元素(d1,d2,d3,……dn)叫做一个元祖,元祖的每一个值叫做一个分量。 【一个域允许的不同取值个数...
  • 数据库SQL语言

    千次阅读 2020-08-23 10:38:22
    这次我来简单带你们了解一下数据库技术必不可少的一项——SQL语言。 SQL,英文是Structured Query Language,直面翻译就是结构化疑问语言。所以说明这个语言是有一定的结构的,所以基础阶段不会太困难。 SQL数据库...
  • 在SQL中关系模式(模式)称为“基本表”(base table);存储模式(内模式)称为“存储文件”(stored file);子模式(外模式)称为“视图”(view);元组称为“行”(row);属性称为“列”(column)。 ...
  • 关系模式规范化(设计范式)

    千次阅读 多人点赞 2020-10-28 19:13:56
    第一范式的基础上满足进一步要求的称为第二范式,简称2NF,其余范式以此类推。对于各种范式之间有如下关系: 1. 第一范式 1NF 定义:属于第一范式关系的所有属性都不可再分,即数据项不可分。 理解:第一范式...
  • 关系数据库关系指什么

    千次阅读 2021-07-31 17:07:11
    用户看来,一个关系模型的逻辑结构是一张二维表,由行和列组成。这个二维表就叫关系,通俗地说,一个关系对应一张表。 2、元组(记录)。表的一行即为一个元组,或称为一条记录。 3、属性(字段)。数据表的...
  • 关系代数 运算符 含义 集合运算符 ∪ 并 - 差 ∩ 交 × 笛卡尔积 专门的关系运算符 σ 选择 ...
  • Database之SQLSever:SQLSever数据库管理人员...数据库三级模式 数据依赖 数据库范式1NF、2NF、3NF、BCNF、4NF、5NF 多种数据库恢复模式:简单恢复、批日志恢复、完全恢复 启动SQLServer数据库服务时,可设定一
  • sql中名词解释

    千次阅读 2018-07-31 09:24:54
    定义:也称逻辑模式,是数据库全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。 理解: ① 一个数据库只有一个模式; ② 是数据库数据逻辑级上的视图; ③ 数据库模式以某一种数据模型为基础; ④ ...
  • 最简单的形式,默认数据源(除非由spark.sql.sources.default配置)将用于所有操作。 Scala代码: val usersDF = spark.read.load("examples/src/main/resources/users.parquet") usersDF.select("name", ...
  • 如何清除SQL数据库的数据?

    千次阅读 2021-01-30 09:17:03
    展开全部清除SQL数据库的数据可以按照以下步骤进行:1.首先需要注意的是,...2.SQL Server的数据库文件,一般都保存安装目录的DATA文件夹。单击“微软开始图标”->“所有程序”->“Microsoft SQL ...
  • SQL概述 SQL(Structured Query Language):结构化查询语言,是关系数据库的标准语言 SQL是一个通用的、功能极强的关系数据库...定义关系模式,插入数据,建立数据库; 对数据库的数据进行查询和更新; 数据库...
  • 1.以下面的数据库关系模式为例,写出完成以下查询功能的SQL语句。(每小题2分) 关系模式如下: 学生(学号,学生姓名,性别,出生年月,出生地,专业号,班级) 简写为:s(s#,sname,ssex,sbirthin,placeofb,scode#,...
  • 一篇关于sql server 三种恢复模式的文章 简介 SQL Server的事务日志无疑是SQL Server最重要的部分之一。因为SQL SERVER利用事务日志来确保持久性(Durability)和事务回滚(Rollback)。从而还部分确保了事务的...
  • 原文:浅谈SQL Server的事务日志和三种恢复模式 简介 SQL Server的事务日志无疑是SQL Server最重要的部分之一。因为SQL SERVER利用事务日志来确保持久性(Durability)和事务回滚(Rollback)。从而还部分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 94,351
精华内容 37,740
关键字:

关系模式在sql中称为

友情链接: CreateThreadExample.rar