- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为当前位于 LDAP 存储中的主机数据提出一个 PostgreSQL 模式。该数据的一部分是一台机器可以拥有的主机名列表,该属性通常是大多数人用来查找主机记录的关键。
我想摆脱将此数据移动到 RDBMS 的一件事是能够在主机名列上设置唯一性约束,以便无法分配重复的主机名。如果主机只能有一个名字,这会很容易,但由于他们可以有多个名字,所以会更复杂。
我意识到这样做的完全规范化的方法是有一个主机名表,外键指向主机表,但我想避免每个人都需要为最简单的查询做连接:
select hostnames.name,hosts.*
from hostnames,hosts
where hostnames.name = 'foobar'
and hostnames.host_id = hosts.id;
我认为使用 PostgreSQL 数组可以解决这个问题,它们确实使简单的查询变得简单:
select * from hosts where names @> '{foobar}';
但是,当我在主机名属性上设置唯一性约束时,它当然会将整个名称列表视为唯一值,而不是每个名称。有没有办法让每个名称在每一行中都是唯一的?
如果没有,是否有人知道另一种更有意义的数据建模方法?
最佳答案
您可能需要重新考虑规范化您的架构。没有必要让每个人都“即使是最简单的查询也加入”。创建一个 VIEW
为此。
表格可能如下所示:
CREATE TABLE hostname (
hostname_id serial PRIMARY KEY
, host_id int REFERENCES host(host_id) ON UPDATE CASCADE ON DELETE CASCADE
, hostname text UNIQUE
);
代理主键hostname_id
是可选的。我更喜欢有一个。在你的情况下 hostname
可能是主键。但是许多操作使用简单、小的 integer
会更快 key 。创建外键约束以链接到表 host
.
创建这样的 View :
CREATE VIEW v_host AS
SELECT h.*
, array_agg(hn.hostname) AS hostnames
-- , string_agg(hn.hostname, ', ') AS hostnames -- text instead of array
FROM host h
JOIN hostname hn USING (host_id)
GROUP BY h.host_id; -- works in v9.1+
从pg 9.1开始,GROUP BY
中的主键 涵盖 SELECT
中该表的所有列列表。 release notes for version 9.1 :
Allow non-
GROUP BY
columns in the query target list when the primarykey is specified in theGROUP BY
clause
查询可以像使用表一样使用 View 。通过这种方式搜索主机名会大大更快:
SELECT *
FROM host h
JOIN hostname hn USING (host_id)
WHERE hn.hostname = 'foobar';
前提是您有关于 host(host_id)
的索引,应该是这种情况,因为它应该是主键。另外,UNIQUE
对 hostname(hostname)
的约束自动实现其他需要的索引。
在 Postgres 9.2+ 中,如果您可以获得 index-only scan,多列索引会更好从中:
CREATE INDEX hn_multi_idx ON hostname (hostname, host_id);
从 Postgres 9.3 开始,您可以使用 MATERIALIZED VIEW
,情况允许。尤其是当您在表格中阅读的次数远多于在表格中写的次数时。
如果我不能说服你相信正义的道路,这里有一些对黑暗面的帮助:
这是一个如何强制主机名唯一性的演示。我用一个表 hostname
在表 host
上收集主机名和触发器使其保持最新状态。独特的违规行为引发异常并中止操作。
CREATE TABLE host(hostnames text[]);
CREATE TABLE hostname(hostname text PRIMARY KEY); -- pk enforces uniqueness
触发函数:
CREATE OR REPLACE FUNCTION trg_host_insupdelbef()
RETURNS trigger
LANGUAGE plpgsql AS
$func$
BEGIN
-- split UPDATE into DELETE & INSERT
IF TG_OP = 'UPDATE' THEN
IF OLD.hostnames IS DISTINCT FROM NEW.hostnames THEN -- keep going
ELSE
RETURN NEW; -- exit, nothing to do
END IF;
END IF;
IF TG_OP IN ('DELETE', 'UPDATE') THEN
DELETE FROM hostname h
USING unnest(OLD.hostnames) d(x)
WHERE h.hostname = d.x;
IF TG_OP = 'DELETE' THEN RETURN OLD; -- exit, we are done
END IF;
END IF;
-- control only reaches here for INSERT or UPDATE (with actual changes)
INSERT INTO hostname(hostname)
SELECT h
FROM unnest(NEW.hostnames) h;
RETURN NEW;
END
$func$;
触发器:
CREATE TRIGGER host_insupdelbef
BEFORE INSERT OR DELETE OR UPDATE OF hostnames ON host
FOR EACH ROW EXECUTE FUNCTION trg_host_insupdelbef();
SQL Fiddle进行试运行。
在数组列上使用GIN 索引 host.hostnames
和 array operators使用它:
关于arrays - PostgreSQL 可以对数组元素进行唯一性约束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8016776/
我在理解应该如何在 JWT 中使用 jti 声明时遇到一些问题。据我在其他 SO 问题和在线文档中看到的,想法是它们应该是独一无二的,但在什么范围内是独一无二的?每个站点/应用程序一个 jti?每个
我想知道cookie名称的最大值是多少?每个域和/或路径的 cookie 名称是否唯一? 最佳答案 所有这些信息均在RFC 2965 - HTTP State Management Mechanism
这基本上是问题 here 的扩展. 我正在处理一个旧的 MFC 应用程序,其中的 resource.h 文件似乎已被手动编辑并且变得困惑。我看到那里有冲突的 ID。 我只是想确认我们是否可以拥有两个具
1. codeigniter的上传库的encrypt_name选项检查是唯一的? 我知道overwrite选项很重要。如 overwrite是 TRUE ,它会覆盖,如果是 FALSE ,它将通过在名
我可以确定.Method.MethodHandle.GetFunctionPointer()每个匿名函数都是唯一的吗? 想做 public static T Get(Func getDataCallb
在时态表 (Oracle DBMS) 中强制键唯一性的最佳方法是什么。时态表是一个时间跨度记录所有历史状态的表。 例如,我们有一个这样的 Key --> Value 关联 ... create tab
对于某些测试,我需要生成一个可能很长的非随机整数序列,该序列具有预定义的唯一性。我将唯一性定义为一个 float ,等于“序列中唯一 数的数量”除以“序列总长度”。这个数字应该在(0, 1]半开区间内
我敢肯定这是一个愚蠢的问题,但谷歌搜索让我一无所获。 是否每个设备供应商都构建自己的 Android?更重要的是,每个设备供应商是否使用其(供应商的)自己的系统签名 key 对其构建进行签名,这样我们
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Is a GUID unique 100% of the time? 看完Guid上的所有帖子后,我仍然不清
我有用户放置的链接和他们在数据库中将被保存 对于 facebook,url 可能是这样的 www.facebook.com http://facebook.com https://facebook.c
给定以下 key : int key = Guid.NewGuid().GetHashCode(); 这个key是否像Guid的唯一性一样唯一? 最佳答案 pigeonhole principle说不
在 C++11 中,我正在使用这个 typeid(T).name() 用于我自己的哈希计算。我不需要程序运行或编译之间的结果相同。我只需要它对于类型是唯一的。我知道,它可以为不同的类型返回相同的名称,
我有一个关于唯一性验证的问题。 来自:http://guides.rubyonrails.org/active_record_validations_callbacks.html#uniqueness
线程上下文的类加载器有多独特。每次启动线程时都会重置吗? 我们能否始终确保 2 个并行线程永远不会具有相同的上下文类加载器? 我看到像 Axis 这样的一些框架依赖于此来获取和设置运行时设置变量。 最
在 UITableViewCell 中,单元格中有多个 uitextfield 那么如何在 uitextfield 委托(delegate)方法中识别哪个文本字段生成操作而不是标记属性? 最佳答案 你
在 Rails 3.0.12 (Ruby 1.8.7) 中使用 UTF 字符时,我遇到了 Rails 唯一性验证器的问题。 这是我的小测试: 正确: name = "dave" count = Use
我正在编写一个用户系统,用户将在其中使用 Twitter 的 API 登录,然后我将信息连同我让用户输入的一些额外信息一起存储在数据库中。我希望用户能够登录后返回,而不必再次登录。我决定获取有关用户的
OPC UA规范(第3部分:地址空间模型)说 5.2.2 NodeId ... A Server shall persist the NodeId of a Node, that is, it sha
是否可以使用 XML 1.1 模式来验证文档中没有两个元素共享一个 id。例如,附加的 XML 文档应该失败,因为 id 的 0、1 和 3 不是唯一的。
在 SQL Server 中,我创建了一个带有 ID 列的表,我将其设为 IDENTITY COLUMN, EmployeeID int NOT NULL IDENTITY(100,10) PRIMA
我是一名优秀的程序员,十分优秀!