我正在考虑使用图形数据库管理系统(简称 DBMS)作为我的单用户桌面应用程序的应用程序文件格式。
是否有基于单文件的图形 DBMS(图形 DBMS的 SQLite 的“等价物”)?
通常,当我看到使用以下内容的 SQL 时:
select * from employees where epmloyeeTypeId in (select id from type where name = 'emp')
Run Code Online (Sandbox Code Playgroud)
我where
用这个替换:
select e.* from employees e
inner join type t on t.id=e.epmloyeeTypeId and t.name = 'emp'
Run Code Online (Sandbox Code Playgroud)
如果它是一个not in
(如下所示)而不是一个in
子句,是否可以对逆做同样的事情?
INSERT into Subscriptions(ProjectId, RecordTypeCID, NTID, Active, Added, LastUpdate, UpdateBy)
SELECT @ProjectId, RecordTypeCID, @NTID, 1, GETDATE(), GETDATE(), @NTID
FROM @Check CHK
WHERE CHK.ActiveStatus=1
And Not Exists (SELECT SubscriptionId FROM Subscriptions
WHERE ProjectId=@ProjectId
and NTID=@NTID
and RecordTypeCID = CHK.RecordTypeCID
) …
Run Code Online (Sandbox Code Playgroud) 我使用带有Sequelize 的PostgreSQL作为我的 ORM。
我有一种类型,User
。第二种类型是Group
,它可以通过一个GroupMemberships
表将任意数量的用户与其关联。User
s 也可以拥有任意数量的Group
s。
我的第三种类型 ,Playlist
可以属于 aUser
或 a group
。为这种类型设计模式以便它可以拥有一种类型的所有者或两者之一的最佳方法是什么?
我的第一遍创建了两个关联,但一次只填充一个。这可能有效,但看起来很笨拙并且使查询变得困难。
附加信息
以下是我对 MDCCL 通过评论发布的澄清请求的回应:
(1)如果一个播放列表是由给定资集团,可以说,这个播放列表是关系到一个一对多的用户,只要他们是会员这样的小组,对不对?
我相信这在技术上是正确的,但这种一对多关联并不明确存在。
(2) 那么,一个特定的播放列表是否有可能同时被一对多的群组拥有?
不, a 应该不可能被Playlist
一对多拥有Groups
。
(3) 特定播放列表是否可能由一对多组拥有,同时由不是该组成员的一对多用户拥有?
不,因为如 (2) 中的一对多 from Playlist
toGroup
不应该存在。此外,如果 aPlaylist …
我有两张桌子:一张user
桌子和一张friendship
桌子。假设friendship
表格如下所示:
friendship
------------
user_one_id
user_two_id
other_fields
Run Code Online (Sandbox Code Playgroud)
我需要强制执行和忽略ordering值组合的唯一性,因此:(user_one_id, user_two_id)
user_one_id | user_two_id
------------+------------
1 | 2
2 | 1 -- the DBMS should throw a unique constraint error when trying to insert a row like this one.
Run Code Online (Sandbox Code Playgroud)
另外重要的一点是,user_one_id
代表发起的friendship
,并user_two_id
代表收件人,所以我不能只是做了两个“小”的ID user_one_id
。
问题
有没有办法使用约束来做到这一点,还是应该以其他方式实现?
有没有办法防止登录列出架构中的表和列?
我必须授予对远程登录的访问权限才能在单个视图上进行查询;但是,我还必须确保此类登录不能列出该架构上的每个对象。
DENY VIEW ANY DEFINITION TO public;
PostgreSQL 上有类似 MS SQL SERVER 的东西吗?
postgresql authentication security authorization permissions
在相关的业务背景,既成员和组织需要有一个帐户的资金。资金可以转移
注意事项
为了为这种场景构建数据库,我创建了以下三个表:
CREATE TABLE Members (
memberid serial primary key,
name varchar(50) unique,
passwd varchar(32),
account integer
);
CREATE TABLE Organizations (
organizationid serial primary key,
name varchar(150) unique,
administrator integer references Members(memberid),
account integer
);
CREATE TABLE TransferHistory
"from" integer, -- foreign key?
"to" integer, -- foreign …
Run Code Online (Sandbox Code Playgroud) 我有一个用于存储“任务”的表。任务可以是父项和/或子项。我使用“ ParentID ”作为 FK 引用同一张桌子上的 PK。它是 NULLABLE,所以如果它是NULL它没有父任务。
示例是下面的屏幕截图...
在我的团队中,有人认为创建一个单独的表来存储 ParentID 会更好(对于规范化/最佳实践),从而避免表中出现 NULL 并导致更好的规范化设计。
这会是一个更好的选择吗?或者查询会更困难并导致性能问题?
我们只想从一开始就做好设计,而不是以后再发现问题。
现有表的 SQL-DDL 代码:
CREATE TABLE [Tasks].[TaskDetail]
(
[TaskDetailID] [int] IDENTITY(1,1) NOT NULL,
[TaskName] [varchar](50) NOT NULL,
[TaskDescription] [varchar](250) NULL,
[IsActive] [bit] NOT NULL CONSTRAINT [DF_TaskDetail_IsActive] DEFAULT ((1)),
[ParentID] [int] NULL,
CONSTRAINT [PK_TaskDetail_TaskDetailID] PRIMARY KEY CLUSTERED ([TaskDetailID] ASC),
CONSTRAINT [FK_TaskDetail_ParentID] FOREIGN KEY([ParentID]) REFERENCES [Tasks].[TaskDetail]([TaskDetailID])
);
Run Code Online (Sandbox Code Playgroud) 我知道 SQL Server 2016 让我们使用 SYSTEM_VERSIONING 像:
CREATE TABLE EmpSalary
(
EmpID int NOT NULL PRIMARY KEY CLUSTERED
, SalaryAmt decimal (10,2) NULL
, SalaryBeginDT datetime2 GENERATED ALWAYS AS ROW START NOT NULL
, SalaryEndDT datetime2 GENERATED ALWAYS AS ROW END NOT NULL
, PERIOD FOR SYSTEM_TIME (SalaryBeginDT, SalaryEndDT)
)
WITH (SYSTEM_VERSIONING = ON);
Run Code Online (Sandbox Code Playgroud)
同样要停用此功能,只需更改表:
ALTER TABLE EmpSalary SET (SYSTEM_VERSIONING = OFF );
Run Code Online (Sandbox Code Playgroud)
我的问题是如何检查表的 SYSTEM_VERSIONING 是否打开,然后更改表?
我正在实施一个带有支付系统的应用程序,我需要记录通过该应用程序进行的交易。此外,我需要使用有关交易的一些信息来呈现一些 KPI。我已经在 Postgres 中有一个实现,其中我的表有两列id
和transaction
(jsonb)。在我的交易列中,我有一个如下所示的对象:
2018: {
November: {
list_of_transactions: [],
totalAmountEarned: 0,
numberOfTransactions: 0,
avarageSpending: 0,
numberOfCoins: 0,
numberOfUsers: 0
}
}
Run Code Online (Sandbox Code Playgroud)
现在,每当我做一个交易,我检查year
和month
自带的请求存在,否则将它们添加到该对象,并推动事务中list_of_transactions
,并相应地更新所有的其他键。
我想知道这是否是解决问题的好方法,或者实际上是一种非常糟糕的方法。创建不同的表并以“SQL 方式”对它们进行规范化是更好的解决方案吗?你有什么建议吗?
其他注意事项
一个附带问题:既然会有很多很多交易,每年创建一个新表是个好主意吗?
涉及的所有数据的结构将完全相同,因此我应该创建多个数据库并进行连接。由于会有很多很多交易:每年创建一个新表是个好主意吗?
我试图了解从视图中选择数据的性能影响,其中视图中的一列是原始表中其他数据的函数。
无论计算列是否在所选列的列表中,是否都会执行计算?
如果我有一张桌子并且视图像这样声明
CREATE TABLE price_data (
ticker text, -- Ticker of the stock
ddate date, -- Date for this price
price float8, -- Closing price on this date
factor float8 -- Factor to convert this price to USD
);
CREATE VIEW prices AS
SELECT ticker,
ddate,
price,
factor,
price * factor as price_usd
FROM price_data
Run Code Online (Sandbox Code Playgroud)
会是乘法类似下面的查询来执行?
select ticker, ddate, price, factor from prices
Run Code Online (Sandbox Code Playgroud)
是否有参考以一种方式或另一种方式保证这一点?我正在阅读有关 Postgres 规则系统的文档,但我认为答案确实在于优化器,因为规则系统文档中没有任何内容表明它不会被选中。
我怀疑在上述情况下没有执行计算。我将视图更改为使用除法而不是乘法,并将0
for插入factor
到price_data
. 上面的查询没有失败,但如果修改查询以选择计算列,则修改后的查询失败。
有什么方法可以理解在执行 a 时 …
postgresql ×6
sql-server ×3
subtypes ×2
ddl ×1
except ×1
graph ×1
graph-dbms ×1
hierarchy ×1
performance ×1
permissions ×1
primary-key ×1
schema ×1
security ×1
view ×1