我有一个表,其中某些属性(列)将记录定义为唯一。 例如,表格记录簿记录可能具有以下设计:
表格书:
id(自动增量,bigint,唯一,主键)
标题
AUTHOR_ID
......其他专栏
表格出版物:
id(自动增量,bigint,唯一,主键)
book_id(int,fkey to book.id)
publishing_company_id(int,fkey to company.id)
publication_date
......其他专栏
此设计是在假设公司不能在同一日期多次出版同一本书的情况下进行的。所以我设置了一个包含列[book_id,publishing_company_id,publication_date]的唯一复合键。到目前为止一切都很清楚。
现在让我们假设我们决定为出版物存储另一个属性,例如语言。语言将以逗号分隔的字符串形式存储。因此,只要语言不同,现在可以有同一本书在同一日期发布的同一本书的2条记录。在唯一复合键中添加语言可以为我们提供以下方案:
book_id = 12
publishing_company_id = 145
publication_date = 2018-02-09
language = spa
价格= 25
和
book_id = 12
publishing_company_id = 145
publication_date = 2018-02-09
language = en
价格= 30
如果语言是唯一区分记录的东西(价格是相同的),记录可以像上面一样单独保存,或者合并到一个记录中:
book_id = 12
publishing_company_id = 145
publication_date = 2018-02-09
language = spa,en
价格= 25
这个设计的问题在于,如果我们创建一个包含多种语言(en,spa,fr,de,nl,jp)的书的记录,然后是具有重叠语言的相同记录(spa,fr,sq) ),它将它们识别为不同的记录,因为语言值不相同。相反,我想避免使用相同语言的同一本书的两个记录。所以语言spa和fr只能存在于上面的一个记录中,而语言sq可以是一个单独的记录,只要它不在同一个出版物的另一个记录中。
总结一下,我不想为复合键的列搜索相同的匹配项,而是希望搜索某些列的相同匹配项,以及“匹配”列表。比较其他一些搜索价值重叠的人。
我可以(并且会)在应用程序级别处理它,但我也想在数据库设计中支持相同的逻辑。
有没有办法做这样的事情?