【问题标题】:Correct way to maintain a One to many relation with fixed count of children rows?保持与固定子行数的一对多关系的正确方法?
【发布时间】:2020-05-23 11:26:25
【问题描述】:

我正在为 Authors 表和 Books 表之间的常见一对多关系建模。

按照惯例,一个作者最多可以分配 30 本书。因此,当一位作者获得最大数量的书籍,而另一位想要分配给同一作者时,我必须删除最旧的一本并添加新的。

我可以执行删除最旧书并添加新书以保持 30 书限制的明显操作,但我想知道这是否是一种更直接的方法,或者这是否是这种情况下的常见做法。

【问题讨论】:

  • 对数据存储(而不是数据检索)施加这样的限制有点不寻常,所以我怀疑没有普遍的做法;我认为这在一定程度上取决于用户体验应该是什么样的,以及用户是否可能想要决定哪些条目被覆盖。
  • 一个想法是为每个作者用 30 行填充表,然后只允许在按“空白”排序时对行进行更新,然后是日期。
  • 另外,idea 表有一个 record_deleted 列,值为 1/0,如果每个作者行达到 30 行,则必须更新该列,使用 record_deleted 列上的 where 子句获取 30 行。

标签: mysql entity-framework-core


【解决方案1】:

您可以考虑以下几点:

CREATE TABLE my_table(id SERIAL PRIMARY KEY,author_id INT NOT NULL,book VARCHAR(50) NULL);

INSERT INTO my_table (author_id) VALUES (1),(1),(1);

UPDATE my_table SET book = 'my first book' WHERE author_id = 1 ORDER BY book,id LIMIT 1;

SELECT * FROM my_table;
+----+-----------+---------------+
| id | author_id | book          |
+----+-----------+---------------+
|  1 |         1 | my first book |
|  2 |         1 | NULL          |
|  3 |         1 | NULL          |
+----+-----------+---------------+

UPDATE my_table SET book = 'my second book' WHERE author_id = 1 ORDER BY book,id LIMIT 1;

UPDATE my_table SET book = 'my third book' WHERE author_id = 1 ORDER BY book,id LIMIT 1;

UPDATE my_table SET book = 'my fourth book' WHERE author_id = 1 ORDER BY book,id LIMIT 1;

SELECT * FROM my_table;
+----+-----------+----------------+
| id | author_id | book           |
+----+-----------+----------------+
|  1 |         1 | my fourth book |
|  2 |         1 | my second book |
|  3 |         1 | my third book  |
+----+-----------+----------------+

哦,忘了添加时间戳(或用于编辑 id 的机制)- :-$,但希望你明白;如果有时间我会编辑它

【讨论】:

  • 好的,这就是列表限制它的东西。我只需要记住使用更新:)
【解决方案2】:

如果您不想提前为每个作者插入 30 个数据集,您可以创建一个存储过程,首先计算作者数量,如果少于 30 个,则进行插入,否则您可以像“草莓”一样更新作者建议。 如果您通过存储库访问数据库,则可以在 repo - 方法中以相同的方式处理它。

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 2022-01-02
    • 1970-01-01
    • 2011-03-07
    • 2016-04-30
    • 1970-01-01
    • 2019-12-30
    • 2017-06-29
    • 1970-01-01
    相关资源
    最近更新 更多