我正在尝试为我的应用程序创建一个数据库,有一件事我想找到最好的方法是创建我Users和Items表之间的一对多关系.
我知道我可以做一个第三个表,ReviewedItems和具有列是一个UserID和一个ItemID,但我想知道是否有可能使一列Users,让我们说reviewedItems,这是一个包含外键的整数数组Items是该User审查.
如果PostgreSQL可以这样做,请告诉我!如果没有,我会走下我的第三张桌子路线.
我正在建模多对多关系,其中大部分时间只从一侧访问关系.它更像是一个层次结构,可以自上而下访问,而不是相反.
调查已经并且属于许多问题并且属于许多答案.
这两种关系必须是多对多的,因为同一个问题可以在不同的调查中重复使用,并在许多问题中得到相同的答案.这是一项要求.
标准M2M实现将使用两个连接表,surveys_questions和questions_answers.相反,我正在考虑使用PostgreSQL的整数数组存储question_ids在Survey和answer_idsQuestion中.
我们可以利用ANY运算符来查询与外键数组匹配的所有行.
我们如何使用SQL查询所有问题和问题的答案?
我们如何匹配使用外键数组返回的行的顺序?即.使用question_ids = [1,2,3]保证返回顺序为1,2,3的问题行.
与联结表相比,这如何表现性能(假设适当的索引,无论它们是什么)?
你能建议一下吗?有没有像这样建模M2M的资源?
更新
有人建议将数组外键的引用完整性添加到PostgreSQL 9.3,但它没有包括在内:http://blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/
关于使用外键数组PostgreSQL JOIN维护顺序的问题,数组类型与数组元素顺序,如何实现?
我正在尝试为当前在LDAP存储中的主机数据提出PostgreSQL架构.部分数据是机器可以拥有的主机名列表,该属性通常是大多数人用来查找主机记录的关键.
我想将这些数据移动到RDBMS的一件事是能够在hostname列上设置唯一性约束,以便无法分配重复的主机名.如果主机只能有一个名称,这将很容易,但由于它们可以有多个名称,因此它更复杂.
我意识到这样做的完全规范化的方法是让一个主机名表的外键指向hosts表,但是我想避免让每个人都需要为最简单的查询做连接:
select hostnames.name,hosts.*
from hostnames,hosts
where hostnames.name = 'foobar'
and hostnames.host_id = hosts.id;
Run Code Online (Sandbox Code Playgroud)
我认为使用PostgreSQL数组可以为此工作,它们肯定使简单的查询变得简单:
select * from hosts where names @> '{foobar}';
Run Code Online (Sandbox Code Playgroud)
但是,当我在hostnames属性上设置唯一性约束时,它当然会将整个名称列表视为唯一值而不是每个名称.有没有办法让每个名称在每一行都是唯一的?
如果没有,有没有人知道另一种更有意义的数据建模方法?
CREATE TABLE test ( id int PRIMARY KEY , name );
CREATE TABLE test1 ( id integer[] REFERENCES test , rollid int );
Run Code Online (Sandbox Code Playgroud)
错误:外键约束“test3_id_fkey”无法实现详细信息:键列“id”和“id”的类型不兼容:整数[]和整数。
之后我也尝试另一种方式
CREATE TABLE test1 ( id integer[] , rollid int);
ALTER TABLE test1 ADD CONSTRAINT foreignkeyarray FOREIGN KEY (id) REFERENCES test;
Run Code Online (Sandbox Code Playgroud)
错误:无法实现外键约束“fkarray”详细信息:键列“id”和“id”的类型不兼容:整数 [] 和整数。
所以我尝试创建一个外键数组意味着它说错误。请告诉我任何人?
postgresql 版本是 9.1。