标签: referential-integrity

如何从大型 ER 模型中选择数据子集?

我的数据库中有一个相当大的 ER 模型和大量数据。现在我想将这些数据的一个子集放入不同的数据库中以进行测试。问题是如何从所有表中获取一个子集,这样我就不会破坏参照完整性并从数据库中获取孤立的记录?我的意思是,如果我选择 100 条记录,例如从“产品”表中,我如何轻松地从引用的表(以及这些表被引用的表)中获取所有数据?是否有任何工具可用于此目的或仅使用纯 SQL?

sql-server-2008 database-design sql-server referential-integrity

5
推荐指数
1
解决办法
2849
查看次数

帮助模拟体育联盟的良好 RDBMS 事务架构设计

我需要为典型的 RDBMS 设计一个数据模型,该模型将模仿典型体育联盟的结构。在架构上我的要求是:

  • 标准化良好

  • 事务性

  • 应用程序开发人员可以使用流行的 ORM 工具对其进行合理建模

所需架构的属性:

  • 可以有很多联赛

  • 一个联赛中可能存在 1 个或多个分区

  • 在一个部门中可能存在 1 个或多个会议

  • 单个会议中可能存在 1 个或多个团队

  • 有可能存在1个或多个团队当且仅当该分部没有被划分成会议(换句话说,司不需要拆分成会议和代替团队可能会直接有到单个分部的参考而不是会议)

  • 单个团队中可能存在 1 名或更多玩家

  • 玩家存在于 1 个且只有 1 个Team 中

如果联盟结构是僵化的,这将很容易做到并保持参照完整性。这是我的想法,但我想知道这是否是一个好的设计,或者对于这种情况是否有更好的方法。

  • 积分榜:...

  • LeagueGroup 表:FK - LeagueId NOT NULL,FK - LeagueGroupParentId NULLABLE,LeagueGroupType

  • 球队:FK - LeagueGroupId 不为空

  • 球员:FK - TeamId 不为空

所以基本上我认为 Divisions 和 …

database-design referential-integrity

5
推荐指数
1
解决办法
928
查看次数

SQL 是否在插入方面管理外键约束?

假设我有一个包含数据 A1 和 A2 的表 tbl1,其中 A1 是主键。然后我有另一个表 tbl2,其中包含数据 A3 和 A1,两者一起作为主键,将 A1 引用为来自 tbl1 的外键。

我可以在 tbl2 中插入一个元组,它的 A1 不在 tbl1 中吗?SQL 是否将其作为错误来管理?或者在这种情况下会发生什么?

foreign-key constraint insert referential-integrity

5
推荐指数
1
解决办法
549
查看次数

可选择更具体的关系

原谅我的标题,我想不出任何能准确描述我在说什么的东西。

我目前有以下关系。

CREATE TABLE Events 
(
    ID INT IDENTITY(1,1) NOT NULL,
    Name NVARCHAR(64) NOT NULL,
    PRIMARY KEY(ID)
)

CREATE TABLE Locations
(
    ID INT IDENTITY(1,1) NOT NULL,
    EventID INT NOT NULL,
    Name NVARCHAR(64) NOT NULL,
    PRIMARY KEY(ID)
)

ALTER TABLE Locations ADD FOREIGN KEY(EventID) REFERENCES Events(ID)
Run Code Online (Sandbox Code Playgroud)

基本上,一个事件可以有零个或多个位置。我现在想要的是将捐赠与事件相关联,或者更具体地将其与位置相关联。

CREATE TABLE Donations
(
    ID INT IDENTITY(1,1) NOT NULL,
    EventID INT NOT NULL,
    LocationID INT NULL, -- this is optional
    PRIMARY KEY(ID)
)

ALTER TABLE Donations ADD FOREIGN KEY(EventID) REFERENCES Events(ID)
ALTER TABLE …
Run Code Online (Sandbox Code Playgroud)

schema database-design sql-server referential-integrity

5
推荐指数
1
解决办法
145
查看次数

限制在边界上的不重叠矩形

我正在尝试对电路板上零件的放置进行建模。没有任何有意义的限制,我的基本架构如下所示:

create table part (
    part_id bigserial primary key,
    name text not null,
    width double precision not null,
    height double precision not null
);
create table board (
    board_id bigserial primary key,
    width double precision not null,
    height double precision not null
);
create table board_part (
    board_id bigint not null references board,
    part_id bigint not null references part,
    position point not null
);
Run Code Online (Sandbox Code Playgroud)

SQL Fiddle可视化

对于bb2any board_parts,我想强制执行以下约束:

  1. b位于黑板上:

    box(b.position, …
    Run Code Online (Sandbox Code Playgroud)

postgresql database-design referential-integrity spatial exclusion-constraint

5
推荐指数
1
解决办法
529
查看次数

没有引用列规范的外键

我在SQL Server 文档中注意到引用列的列表不是外键约束的必需参数:

<column_constraint> ::= 
    [ CONSTRAINT constraint_name ] 
    {     { PRIMARY KEY | UNIQUE } 
            (...)

      | [ FOREIGN KEY ] 
            REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ] 
            [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
            [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
            [ NOT FOR REPLICATION ] 

      | CHECK (...)
    }
Run Code Online (Sandbox Code Playgroud)

如果我省略该( ref_column ) …

foreign-key sql-server referential-integrity

5
推荐指数
1
解决办法
2579
查看次数

SELECT + INSERT 或单独插入

我有一个应用程序,其中有几台设备每秒向我的服务器发送数据。在数据库上,我有一个包含设备的表和另一个每秒发送数据的表。

设备第一次发送数据时,服务器脚本应INSERT在设备表中注册 ( ) 该设备 ID 并将数据添加到数据表中。

我的问题是,什么会更快?

  1. 执行SELECT EXISTS查询以确定INSERT设备表中是否需要一个。如果SELECT EXISTS返回 false 则执行 an INSERT,否则什么都不做。

  2. 总是执行一个INSERT语句。考虑到设备 id 是表上的主键,如果设备已经存在它会返回一个错误,否则它会插入它。

只有第一次设备发送数据时才需要一个实际的INSERT,之后INSERT就不需要了。

PostgreSQL 版本是 9.4。

设备表定义如下:

CREATE TABLE common.tag
(
  customer integer,
  hostname character varying(150),
  description text,
  model integer,
  configprofile integer,
  id character varying(150) NOT NULL,
  host integer,
  CONSTRAINT tag_pk PRIMARY KEY (id),
  CONSTRAINT tag_fk_client FOREIGN KEY (customer)
      REFERENCES common.customer (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON …
Run Code Online (Sandbox Code Playgroud)

postgresql insert select referential-integrity

5
推荐指数
1
解决办法
2710
查看次数

REFERENCES 特权仅与创建外键约束有关?实际用例?

今天我了解了GRANT REFERENCES. 在多年的 SQL 管理和开发工作中,我从未听说过它,也从未遇到过问题。

引用自MySQL 5.7 参考手册/GRANT 语法

REFERENCES 启用外键创建。级别:全局、数据库、表、列。

引用自PostgreSQL 9.6 / GRANT

REFERENCES 要创建外键约束,必须对引用列和被引用列都具有此权限。可以为表的所有列或仅特定列授予特权。

GRANT REFERENCES唯一的有关创建一个外键约束?在什么业务案例中禁止创建外键约束(但允许创建表)有意义?你能给我举个真实世界的例子吗?

mysql postgresql foreign-key permissions referential-integrity

5
推荐指数
2
解决办法
6737
查看次数

避免循环/多个更新路径的首选设计

考虑以下设计:

CREATE TABLE dbo.Farmers
(
    FarmerName varchar(10) NOT NULL
        PRIMARY KEY 
);

CREATE TABLE dbo.FarmEquipment
(
    FarmEquipmentName varchar(10) NOT NULL
        PRIMARY KEY 
    , CreatorFarmer varchar(10) NOT NULL
        FOREIGN KEY REFERENCES dbo.Farmers(FarmerName)
        ON UPDATE CASCADE
        ON DELETE CASCADE
);

CREATE TABLE dbo.Fields
(
    FieldName varchar(10) NOT NULL
    , OwnerFarmer varchar(10) NOT NULL
        FOREIGN KEY REFERENCES dbo.Farmers(FarmerName)
        ON UPDATE CASCADE
        ON DELETE CASCADE
    , FarmEquipment varchar(10) NOT NULL
        FOREIGN KEY REFERENCES dbo.FarmEquipment(FarmEquipmentName)
        ON UPDATE CASCADE
        ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)

用例:

  • 农民乔拥有土地。
  • 农民泰德拥有土地。 …

database-design sql-server referential-integrity

5
推荐指数
1
解决办法
1497
查看次数

根据不同表中的相关数据约束数据。这应该在数据库级别还是应用程序级别完成?

我正在开发一个数据库,其中包含我们的客户信息以及有关我们供应商的信息。其中一部分包括将我们的客户与我们的供应商匹配、这些供应商为我们的客户提供给我们的帐号以及我们向客户收取使用这些供应商服务的费用。

背景

在我现在处理的情况下,我有一个表格,其中包含我们客户的帐号、供应商 ID 和该供应商分配给我们客户的帐号。

我还有一个表格,其中包含我们所有供应商的信息和一个相关表格,其中列出了他们的所有服务以及该服务的“基本成本”。

问题

我遇到的问题是将客户与供应商的服务相关联。

如果我只是创建一个表,其中包含我们客户的帐号、供应商的服务 ID 和该服务的成本,那么我可能会遇到不提供该服务的供应商将服务分配给客户的问题。

这是我正在谈论的内容的图表(尽管很粗糙):

图表

因为 VendorServices 和 CustomerVendorServices 之间没有“检查”,所以我可能会在 CustomerVendorServices 表中 VendorServiceID 的位置插入一条记录,用于供应商不提供的服务。

这显然是一个问题,我可以通过与该数据库交互的应用程序的接口来防止它发生,但是如果有一种方法可以让数据库“检查”VendorServiceID 被插入到CustomerVendorServices 表匹配由与 VendorAccountsID/VendorAccountNumber 关联的供应商提供的服务。

我确信这不会令人困惑,如果有人试图理解它,老实说我会感到惊讶,但我想我会试一试。:)

任何帮助和/或建议将不胜感激。

database-design referential-integrity data-integrity relations

5
推荐指数
1
解决办法
79
查看次数