复合唯一键,其中一个列包含多值

k5ifujac  于 2021-06-23  发布在  Mysql
关注(0)|答案(0)|浏览(272)

我有一个表,其中某些属性(列)将记录定义为唯一的。例如,保存帐簿记录的表可能具有以下设计:
台账:
id(自动递增,bigint,unique,主键)
标题
作者id
... 其他列
表发布:
id(自动递增,bigint,unique,主键)
图书id(int,fkey to book.id)
发布公司id(int,fkey to company.id)
出版日期
... 其他列
这种设计是在一个公司不能在同一天出版同一本书不止一次的假设下做出的。因此,我设置了一个唯一的复合键,其中包含[book\u id,publishing\u company\u id,publication\u date]列。直到现在一切都很清楚。
现在假设我们决定为发布存储另一个属性,例如language。语言将以逗号分隔的字符串形式存储在中。所以现在同一本书可以有两条记录,同一家公司在同一天出版,只要语言不同。在unique composite key中添加语言可以提供以下场景:
书籍id=12
发布公司\u id=145
出版日期=2018-02-09
语言=spa
价格=25
以及
书籍id=12
发布公司\u id=145
出版日期=2018-02-09
语言=英语
价格=30
如果语言是区别记录的唯一因素(价格相同),则可以像上面那样单独保存记录,或合并到单个记录中:
书籍id=12
发布公司\u id=145
出版日期=2018-02-09
语言=spa,英语
价格=25
这种设计的问题是,如果我们创建一个具有多种语言(en、spa、fr、de、nl、jp)的图书记录,然后创建一个具有重叠语言(spa、fr、sq)的相同记录,那么它会将它们识别为不同的记录,因为语言值不相同。相反,我想避免同一本书的两个记录,用同一种语言。所以spa和fr语言只能存在于上面的一个记录中,而sq语言可以是一个单独的记录,只要它不存在于同一出版物的另一个记录中。
总之,我不想为复合键的列搜索相同的匹配项,而是希望为某些列搜索相同的匹配项,并为某些列搜索“like”比较,这将搜索值重叠。
我可以(也将)在应用程序级别处理它,但我也希望在数据库设计中支持相同的逻辑。
有办法做这样的事吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题