【问题标题】:Sequences in SQL many to many relationshipsSQL中的序列多对多关系
【发布时间】:2015-07-25 21:06:26
【问题描述】:

如何存储一系列外键值?

假设我有:

table1 {id, 代码}

table2 {id, 序列}

我需要 table2.sequence 来引用许多 table1 记录,这些记录要按照给定的顺序在 php 中连接。我想存储数组,但我不考虑 SQL。我可以走下解析数组字符串的黑暗路线,或向 table2 添加索引列(即每个序列有多行,但随后会做噩梦改变序列),但知道那里有更好的方法。有什么想法吗?

一个例子:

表1:

1个

2 个例子

3 是

4 这个

-

表2:

1 ?[4,3,1,2]?

-

'... where table2.id = 1' -> my_concat_function() -> 'thisisanexample'

【问题讨论】:

  • 因为它们不是外键,而只是一个序列,至少在我阅读时,也许您需要稍微改进一下问题的语言以消除混淆。

标签: mysql sql many-to-many data-modeling


【解决方案1】:

如果你想使用外键,唯一的选择就是你已经描述的:

向 table2 添加一个索引列(即每个序列有多行,但随后会做噩梦改变序列)

这样做的另一个好处是您可以轻松检查哪些序列使用了特定的单词。

其实,这并不是你想的那么噩梦。当你想修改一个序列时,你只需要删除所有具有特定ID的记录,并插入与新序列对应的记录。

在这种情况下,也可以只用 SQL 来获取“句子”:

SELECT GROUP_CONCAT(code SEPARATOR ' ')
FROM (SELECT table2.id, table1.code
          FROM table1 INNER JOIN table2 ON table1.id = table2.sequence
          WHERE table2.id = "$table2id"
          ORDER BY table2.index) AS derived
GROUP BY id

【讨论】:

  • 谢谢。是的,删除整条记录并重新制作还不错;希望为序列编写插入查询会很容易。我完全同意额外的优势——我以后会反对这个!另外,感谢连接指针 - 为我节省了很多多余的代码。
【解决方案2】:

您可以通过引用同一表中的另一列parent_id 来维护table1 本身中的sequence 列。

在 sqlfiddle 中创建了一个示例结构。希望对你有用

http://sqlfiddle.com/#!9/21932/2/0

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多