标签: table

SQL - 具有相同表和关系约束的多对多关系

我有一个 SellerProduct 表。表格中的每一行代表卖家提供的产品信息。SellerProduct 表包含以下列:

id (serial, pk)
productName (nvarchar(50))
productDescription (ntext)
productPrice (decimal(10,2))
sellerId (int, fk to Seller table)
Run Code Online (Sandbox Code Playgroud)

不同卖家的产品可能相同,但每个卖家的 productName、productDescription 和 productPrice 可能不同。

例如,考虑产品 TI-89。卖家 A 可能拥有产品的以下信息:

productName = TI-89 Graphing Calc
productDescription = A graphing calculator that...
productPrice 65.12
Run Code Online (Sandbox Code Playgroud)

卖家 B 可能拥有以下产品信息:

productName = Texas Instrument's 89 Calculator
productDescription = Feature graphing capabilities...
productPrice 66.50
Run Code Online (Sandbox Code Playgroud)

管理员用户需要确定不同卖家的产品是相同的。

我需要一种方法来捕获这些信息(即卖家的产品是相同的)。我可以创建另一个名为 SellerProductMapper 的表,如下所示:

sellerProductId1 (int, pk, fk to SellerProdcut table)
sellerProductId2 (int, pk, fk to SellerProdcut table)
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于它允许对给定行的 SellerProductId1 和 SellerProductId2 来自同一个卖家。这不应该被允许。 …

database-design table many-to-many

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

Sqlite使用其他表中的检查列创建表

我有两个表:

位置

CREATE TABLE IF NOT EXISTS position(
  id_position INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL,
  min REAL NOT NULL CHECK (min > 0),
  max REAL CHECK (max > 0),
);
Run Code Online (Sandbox Code Playgroud)

最低,最高工资链接

员工

CREATE TABLE IF NOT EXISTS employee (
  id_employee INTEGER PRIMARY KEY AUTOINCREMENT,
  id_position INTEGER NOT NULL,
  name TEXT NOT NULL,
  last_name TEXT NOT NULL,
  data_of_birth TEXT NOT NULL CHECK (DATE(data_of_birth) IS NOT NULL AND data_of_birth < DATE('now','localtime')),
  salary REAL NOT NULL CHECK (salary >= position.min AND …
Run Code Online (Sandbox Code Playgroud)

sqlite table check-constraints

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

我应该将 table_definition_cache 设置为什么?

我刚刚发现table_definition_cache并且我正在尝试决定将其设置为什么。由于性能问题,我弄乱了我的配置。

在一台服务器上,我有 36599 个表,当我运行SHOW GLOBAL STATUSOpened tables 的值是 930312。table_definition_cache设置为 20k。

在另一台服务器上,我有 45349 个表,当我运行SHOW GLOBAL STATUSOpened tables 的值是 94383。table_definition_cache设置为 40k。

我不确定将它设置为什么table_definition_cache值,因为服务器似乎做了很多打开/交换。

两台服务器都是 CentOS 6 并且正在运行

服务器版本:5.6.32-78.0 Percona Server (GPL),78.0 版,修订版 8a8e016

感谢您的关注!我非常感谢您的反馈。

mysql innodb percona percona-server table

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

两个不同表的相同表别名 (Oracle)

此示例具有用于两个不同表的相同表别名。我不明白为什么 Oracle 允许这样做,如果允许,结果如何有意义。

create table Table_A (x number);
create table Table_B (x number);
insert into Table_A values (1);
insert into Table_A values (2);
insert into Table_B values (2);
insert into Table_B values (3);

select * from Table_A ;
         X
----------
         1
         2
2 rows selected.

select * from Table_B ;
         X
----------
         2
         3
2 rows selected.

select *
  from Table_A  T
  join Table_B  T
    on T.x = T.x;
         X          X
---------- ----------
         2          2
         2          2
         3          3
         3 …
Run Code Online (Sandbox Code Playgroud)

oracle oracle-11g-r2 alias oracle-12c table

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

一个通用映射表 VS 许多特定映射表

我正在尝试设计数据库表来跟踪最终用户上传的文件。
文件可以在不同的上下文中上传。
每个上下文都是一个不同的表。

举个例子:

  • 员工可以针对“每周费用”条目上传多个“收据”文件。
  • 员工可以针对“宠物”条目上传多个“照片”文件。

这个(人为的)场景中的实体/表是:

  • Employees (Id, Name)
  • Expenses (Id, Date, RequestedRefund, RequestedByEmployeeId)
  • Pets (Id, Name, Type, BelongsToEmployeeId)

我已经有一个名为的表Files,用于跟踪有关文件本身的信息:
Files (Id, Name, Size, Extension, Folder)

我的问题是关于如何根据文件记录映射费用收据上传和宠物照片上传。我知道我可以通过两种方式做到这一点:

第一个选项:

有一个通用映射表:GenericFileMap (FileId, ContextId, Type)
where

  • FileId 是文件记录的id
  • ContextId 是我试图检索的上下文记录的 ID
  • Type 是描述上下文本身的字段

在这种情况下,我会像这样获取员工的所有费用收据:

SELECT *
FROM Employee e
INNER JOIN Expenses ex ON e.Id = ex.RequestedByEmployeeId
INNER JOIN GenericFileMap g ON g.ContextId = ex.Id AND g.Type = 'expense'
INNER JOIN Files f ON g.FileId = f.Id
Run Code Online (Sandbox Code Playgroud)

第二个选项:

每个实体/上下文表都有单独的映射表: …

database-design sql-server table

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

由于缺少 oid 运算符,无法从 pgAdmin4 中的表中输出数据

我目前在本地运行 Postgresql 10.6,我使用 PgAdmin 4.12 与之交互,直到今天一切都运行良好。但是今天我在 pgAdmin 查询编辑器中运行了以下查询:

SELECT * FROM test_table LIMIT 100
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

ERROR:  operator does not exist: - oid at character 125
HINT:  No operator matches the given name and argument type. You might need to add an explicit type cast.
STATEMENT:  SELECT at.attname, at.attnum, ty.typname
        FROM pg_attribute at LEFT JOIN pg_type ty ON (ty.oid = at.atttypid)
        WHERE attrelid=-1519044407::oid AND attnum = ANY (
            (SELECT con.conkey FROM pg_class rel LEFT OUTER JOIN pg_constraint con ON con.conrelid=rel.oid
            AND …
Run Code Online (Sandbox Code Playgroud)

postgresql select table pgadmin-4 objectid

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

删除然后插入相同数据后,表大小无限增长

我创建一个表并用数据填充它:

create table tab
as
select 'value' || level val
from dual
connect by level <= 10000;
Run Code Online (Sandbox Code Playgroud)

如果我然后删除所有行并插入相同的数据:

delete from tab;

insert into tab
select 'value' || level val
from dual
connect by level <= 10000;

commit;
Run Code Online (Sandbox Code Playgroud)

每次执行删除然后插入时表大小都会增加。多次执行这些操作会导致表增长到原始大小的许多倍。

我希望大小保持(大约)相同。为什么会这样?

删除将空间标记为空闲,它实际上并没有缩小段。后续插入应首先使用 HWM 以下的可用空块。

我可以使用alter table tab shrink space.

我在 Oracle 12 和 Oracle 18c 中进行了测试。

oracle delete insert size table

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

MSSQL 中模式的 GRANT CONTROL 有什么作用?

我使用 SQL Server 2016 进行这些测试。

以下不允许我在模式 S 中为用户 U 创建表

USE [D];
GRANT CONTROL ON SCHEMA :: [S] TO [U];
Run Code Online (Sandbox Code Playgroud)

但这确实:

USE [D]
GRANT ALTER ON SCHEMA :: [S] TO [U];
GRANT CREATE TABLE TO [U];
Run Code Online (Sandbox Code Playgroud)

如果您必须运行这两个附加命令以允许用户在特定模式中创建表,那么 GRANT CONTROL 应该做什么?

这个描述很好,但是我可以运行什么样的用例来确认(成功或失败)GRANT CONTROL 命令在运行该命令之前和之后在物理上影响用户在使用和不使用此模式的数据库上的安全性?

https://blogs.msdn.microsoft.com/lcris/2009/08/11/basic-sql-server-security-concepts-ownership-control-take-ownership/

CONTROL 权限:CONTROL 权限可用于轻松地将某个实体的所有权限授予某个主体。它是实体所有权之后的下一个最好的东西,但它不如所有权那么强大。主要区别在于 CONTROL 的被授予者仍然可以被拒绝对实体的一些其他权限。例如,我可以在一个表上被授予 CONTROL,同时我可以在那个表上被拒绝 SELECT,从而阻止我从中选择——这永远不会发生在所有者身上,因为所有者不能被授予或拒绝权限.

security sql-server permissions access-control table

4
推荐指数
1
解决办法
2万
查看次数

SQLServer - 将表视为索引

我的表格或多或少如下:

table Sample (
    location bigint,
    device bigint,
    timestamp datetime,
    type bigint,
    value bigint,
    )
Run Code Online (Sandbox Code Playgroud)

出于性能原因,我们也有一个强大的索引,它具有相同顺序的相同列,除了value在索引中包含而不是使用。

这按预期工作,除了 AFAIU 数据在数据库中保存两次 - 一次在表中,一次在索引中。

问题:从概念上讲,是否有某种方法可以将数据仅保留在索引中?我相信这需要以与索引组织相同的方式组织表,从而有效地消除对索引的需求。我试图创建模拟上述索引的组合主键,但它归结为自动创建相同索引。

index sql-server table

4
推荐指数
1
解决办法
305
查看次数

删除超过 x 天的行而不锁定表

我们有一个相当大的 MS SQL 数据库,有数百万行。我创建了一个简单的脚本来删除超过 1 个月的行,但这似乎锁定了表并给应用程序带来了麻烦。

该表有一个索引的“ID”PK,还有一个我将用于此任务的“日期”列。

在不导致锁定的情况下执行此操作的最佳方法是什么?我正在考虑分区,但不确定它是否是最好的方法。提前致谢。

sql-server delete partitioning table

4
推荐指数
1
解决办法
1036
查看次数