AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 34128
Accepted
Antoine Pinsard
Antoine Pinsard
Asked: 2013-02-06 01:22:14 +0800 CST2013-02-06 01:22:14 +0800 CST 2013-02-06 01:22:14 +0800 CST

Choice- 或 ids-list- 字段表示

  • 772

我想知道表示用户设置的最佳方式是什么,该用户设置既可以从集合中获取值(例如“高”、“中”或“低”),也可以是来自另一个(或相同!)的 ID 列表表(多对多关系)。

我想知道常用的是什么以及每个解决方案的缺点/资产是什么(在性能、完整性和可持续性方面)。

database-design
  • 3 3 个回答
  • 228 Views

3 个回答

  • Voted
  1. Chris Travers
    2013-02-07T23:25:30+08:002013-02-07T23:25:30+08:00

    在某种程度上,任何解决方案都将在很大程度上取决于您在做什么以及您使用的 RDBMS。一般来说,尽管使用文本字段存储逗号分隔的整数列表是个坏主意。

    起点解决方案始终是基于 id 的引用。这是一个很好的起点,因为它遵循适当的关系规则,并且它允许您通过将这些值分解为新的关系来处理诸如多个值之类的事情。事实上,我会说从这里开始总是最好的。

    然而,备选方案在某些情况下和某些 RDBMS 上运行良好。如果您永远不需要删除选项,ENUM 字段(或者带有检查以将它们保持在某些值范围内的文本域)很有用。如果这样做,那么在删除它们之前,您必须确定要对此做些什么。其次,数组类型在某些情况下也很有用(如果数组作为一个整体是域的原子值,它们不一定会破坏 1NF,例如,如果我们将 IPv4 地址表示为 4 个 8 位整数的数组). 基于数组的方法在很大程度上取决于你在做什么和数据库级支持,但在 PostgreSQL 上,我会选择一个数组,其中基数很重要(即数组是一个元组而不是一个集合),并且语义是完全独立的.

    • 3
  2. Neil McGuigan
    2013-02-20T10:57:50+08:002013-02-20T10:57:50+08:00

    你没有给我们太多的工作,“其他表”是关于什么的?让我们假设它现在是自定义优先级。

    为了能够在多种类型上设置外键,您需要使用Table Inheritance。将有一个主表,两种类型都从它“继承”,使用相同的主键字段。

    有几种表继承。单表继承使用空值,但要简单得多。类表继承是规范化的,但更痛苦。

    PRIORITY
    id
    type {generic, custom}
    
    
    PRIORITY_GENERIC
    id pk fk PRIORITY
    name
    
    
    PRIORITY_CUSTOM
    id pk fk PRIORITY
    name
    created_at timestamp
    
    
    USER
    id pk
    name
    priority_id fk PRIORITY
    
    
    insert into priority values
    (1, 'Generic'),
    (2, 'Generic'),
    (3, 'Generic'),
    (4, 'Custom');
    
    
    insert into priority_generic values 
    (1, 'Low'),
    (2, 'Medium'),
    (3, 'High');
    
    
    insert into priority_custom values
    (4, 'Crazy Super High', current_timestamp);
    
    
    insert into user values (1, 'neil', 3);
    insert into user values (2, 'chris', 4);
    
    • 2
  3. Best Answer
    Antoine Pinsard
    2013-02-25T06:52:25+08:002013-02-25T06:52:25+08:00

    “异或配对列”解决方案

    该解决方案包含两个协同工作的列:

    • 可以为“高”、“中”或“低”赋值的可空字符变体“ENUM”列。
    • 一个虚拟列,实际上由第三个表表示,该表在用户表和外部表之间建立关系。就像经典的多对多关系一样。

    如果前者的值为“高”、“中”或“低”,应用程序将仅采用该值而后者将被忽略。另一方面,如果它为 NULL,则将使用 M2M 关系。

    • -1

相关问题

  • 过滤索引是否有助于改进基于输入时间的查询,还是应该避免这种情况?

  • MySQL VARCHAR 和 TEXT 数据类型有什么区别?

  • 存储计算值或根据要求重新计算它们更好吗?[复制]

  • 存储与计算聚合值

  • 在数据仓库中实现多对多关系有哪些方法?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve