我有一个表,用于存储从现场设备接收到的数据序列(计数器)。无论如何,这些序列需要在可配置的时间跨度内有序,但可以无序进入系统。如果设备被重置,那么它的序列号将被设置回 0。
CREATE TABLE [dbo].[TapGapDetail]
(
[Id] [bigint] NOT NULL, --FK to another table
[DeviceESN] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[TapDateUTC] [datetime] NOT NULL, --date event occurred on device
[CreatedDateUTC] [datetime] NOT NULL,
[Counter] [int] NOT NULL,
)
CREATE CLUSTERED INDEX [CX_TapGapDetail] ON [dbo].[TapGapDetail] ([DeviceESN], [CreatedDateUTC], [Counter]) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)
我尝试通过 DeviceESN 和 CreatedDateUTC 切换 CX 的顺序,但在我的系统上,它似乎对 IO 没有太大影响。该表中有数百万行。
示例插入将是:
INSERT INTO TapGapDetail (1, 'A', '1/1/2012 01:00AM', '1/1/2012 01:10AM', 5)
INSERT INTO TapGapDetail (2, 'A', '1/1/2012 12:05AM', '1/1/2012 01:15AM', …Run Code Online (Sandbox Code Playgroud) 我在网上阅读了几篇解释 EAV 结构如何工作的文章,但对它们有不同的解释。一些文章提到它是数据模型元数据(或模式)的表示。其他文章将 EAV 结构描述为本体。我将本体描述为概念模型(显示世界中“事物”之间的关系),或者是数据库中实际数据的类实例。
有人能解释一下这个模型中的每个表在外行术语中代表什么以及如何使用这个 EAV 数据模型吗?
我不认为这是数据模型的表示,因为 [Object] 没有直接链接到 [Attribute]。您需要一个实际值来关联这两者。因此,如果 A 是数据模型中表 O 的字段/列,则无需强制您可以将 [Attribute] A 与 [Object] O 一起使用。现在我确实看到了 RI 表。我认为这意味着“参照完整性”。但是如果我们谈论本体,那么我们可以称之为关系身份。在谈论本体三元组时,我只是指关系或谓词——意思是主语/谓语/宾语。请注意,连接不与属性连接,这将更多地表示与表列的关系数据模型 FK/PK 关系,因此我希望它连接到属性,而不是对象。它与[对象]有关。
如果可以,请对此有所了解。也许我想太多了。如果您有其他有用的 EAV 模型,请告诉我。
参考:http : //eav.codeplex.com

鉴于以下表格:
CREATE TABLE verified_name (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL,
UNIQUE (name, email)
);
CREATE TABLE address (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL,
verified_name_id INTEGER NULL REFERENCES verified_name(id)
);
Run Code Online (Sandbox Code Playgroud)
如何添加附加约束,当address.verified_name_id不为 NULL 时,name和email字段address必须与引用的字段匹配verified_name?
我尝试将以下内容添加到address:
FOREIGN KEY (name, email) REFERENCES verified_name(name, email)
Run Code Online (Sandbox Code Playgroud)
...但即使verified_name_id是 NULL ,该约束也会被应用。
我正在寻找类似于部分索引语法的东西,带有像这样的子句WHERE verified_name_id IS NOT NULL,但是简单地将这样的子句附加到 …
postgresql normalization foreign-key database-design constraint
我在 Debian x86 上安装了 PG 服务器(9.0.4)。
在我的一张桌子中,我使用numeric(6,1):
CREATE TABLE mytable(name text, numfield numeric(6,1))
Run Code Online (Sandbox Code Playgroud)
还为此字段创建了索引:
CREATE INDEX mytable_numfield_idx ON mytable USING btree (numfield);
Run Code Online (Sandbox Code Playgroud)
如果我将此字段与实数值一起使用,一切都会很好。正如我看到的查询使用索引:
EXPLAIN ANALYZE SELECT * FROM kodiall WHERE kodgo=123.0
Run Code Online (Sandbox Code Playgroud)
在 mytable 上使用 mytable_numfield_idx 进行索引扫描(cost=0.00..8.27 rows=1 width=193)(实际时间=0.085..0.087 rows=1 loops=1)
索引条件:(numfield = 123.0)
总运行时间:0.131 毫秒
但是如果我使用 0.0 或 NULL 作为条件值,由于某种原因索引被忽略:
EXPLAIN ANALYZE SELECT * FROM kodiall WHERE numfield=0.0
--EXPLAIN ANALYZE SELECT * FROM kodiall WHERE numfield=NULL
Run Code Online (Sandbox Code Playgroud)
mytable 上的 Seq Scan (cost=0.00..57.80 rows=1080 width=193) (实际时间=0.033..1.853 rows=1088 loops=1)
过滤器:(numfield = …
是否可以通过索引删除 Postgres 数组元素?(使用 Postgres 9.3。)
我在文档(http://www.postgresql.org/docs/9.3/static/functions-array.html)中没有看到任何相关内容,但也许我还缺少其他功能?
我在 PostgreSQL 中有一个表,它描述了一些具有开始日期和结束日期的事件:
CREATE TABLE my_table
(
event_id serial NOT NULL,
start_date timestamp without time zone NOT NULL,
end_date timestamp without time zone NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
单个事件可能与前一个和下一个事件重叠。在下表中,4 个事件中的前 3 个形成连续的时间间隔:
1 '2015-04-02 22:09:03' '2015-04-02 22:19:05'
2 '2015-04-02 22:17:38' '2015-04-02 22:27:38'
3 '2015-04-02 22:25:21' '2015-04-02 22:36:23'
4 '2015-04-02 22:45:23' '2015-04-02 22:55:23'
Run Code Online (Sandbox Code Playgroud)
是否可以编写一个查询来检查两个给定日期之间是否存在连续的日期间隔?
我想要一些类似的东西:
select ...
from my_table
where start_date > '2015-04-02' and end_date < '2015-04-06'
Run Code Online (Sandbox Code Playgroud) 有没有办法强制所有文本数据为大写,而不必重复为每个表编写函数或在客户端执行?
目前我有这个查询:
select
sum(case when my_table.property_type = 'FLAT' then my_table.price else 0 end) as Flat_Current_Asking_Price,
sum(case when my_table.property_type_mapped = 'SEMIDETACHED' then my_table.price else 0 end) as Semidetached_Current_Asking_Price
from
my_table;
Run Code Online (Sandbox Code Playgroud)
所以如果my_table有以下值:
property_type | price
--------------+-------
FLAT | 5000
SEMIDETACHED | 9000
FLAT | 6000
Run Code Online (Sandbox Code Playgroud)
查询将返回:
Flat_Current_Asking_Price | Semidetached_Current_Asking_Price
--------------------------+-----------------------------------
11000 | 9000
Run Code Online (Sandbox Code Playgroud)
如何替换将sum值累积到数组中以获取?
Flat_Current_Asking_Price | Semidetached_Current_Asking_Price
--------------------------+-----------------------------------
{5000, 6000} | {9000}
Run Code Online (Sandbox Code Playgroud) 我正在使用 postgres 表验证规则并尝试CHECK为数组列设置约束。一个想法是只允许长度 > 0 的数组。
这是我想要实现它的方式:
create table words_table (
id serial primary key,
words varchar(20)[] CHECK (array_length(words, 1) > 0)
);
Run Code Online (Sandbox Code Playgroud)
但看起来它不起作用。o_o
insert into words_table (words) values ('{}');
//INSERT 0 1
Run Code Online (Sandbox Code Playgroud)
如何实现这样的约束?
我正在处理一个使用instagram 密钥格式的项目。
TL;DR 64 位整数 ID。
它们将用于查找,我们也喜欢它们用于排序和批处理,因为它们会自然地按创建时间排序。
这些值介于 2^63 和 2^64 之间,因此(只是)太大而无法放入BIGINT.
因此,我们的存储选项似乎是numeric(20)或varchar。varchar不是那么理想,因为我们必须将它们归零才能进行排序才能工作,但是使用数字进行查找会影响性能吗?
postgresql ×8
array ×2
constraint ×2
index ×2
aggregate ×1
datatypes ×1
eav ×1
foreign-key ×1
null ×1
ontology ×1
sql-server ×1