Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有多列的单个固定表与灵活的抽象表_Sql_Mysql_Database_Database Design_Data Modeling - Fatal编程技术网

Sql 具有多列的单个固定表与灵活的抽象表

Sql 具有多列的单个固定表与灵活的抽象表,sql,mysql,database,database-design,data-modeling,Sql,Mysql,Database,Database Design,Data Modeling,我想知道你的网站是否有十几种不同类型的列表(商店、餐厅、俱乐部、酒店、活动),需要不同的字段。创建一个列定义如下的表是否有好处 示例商店: shop_id | name | X | Y | city | district | area | metro | station | address | phone | email | website | opening_hours 或者类似于此的更抽象的方法: object_id | name --------------- 1

我想知道你的网站是否有十几种不同类型的列表(商店、餐厅、俱乐部、酒店、活动),需要不同的字段。创建一个列定义如下的表是否有好处
示例商店:

shop_id | name | X | Y | city | district | area | metro | station | address | phone | email | website | opening_hours
或者类似于此的更抽象的方法:

object_id | name        
---------------
1         | Messy Joe's  
2         | Bate's Motel 

type_id | name
---------------
1       | hotel
2       | restaurant


object_id | type_id
---------------
1         | 2
2         | 1

field_id | name           | field_type
---------------
1        | address        | text
2        | opening_hours  | date 
3        | speciality     | text

type_id | field_id
---------------
1       | 1
1       | 2
2       | 1
2       | 3

object_id | field_id | value
1         | 1        | 1st street....
1         | 3        | English Cuisine
当然,如果值是预定义的,那么它可能更抽象(例如:专业可以有自己的列表)

如果我采用抽象方法,它可以非常灵活,但是查询将更加复杂,有很多连接。 但我不知道这是否会影响执行这些“更复杂”查询的性能

我想知道这两种方法的优点和缺点。我自己可以想象,但我没有经验来证实这一点。

这种“抽象”方法被称为“规范化”,看起来像第三范式(3NF)


另一个称为“非规范化”,可以是一个有效的性能选项。。。当您使用规范化方法遇到速度问题时,而不是以前。

如何在代码中表示列表?我猜
列为一个超类型,将
商店
休息
等列为子类型

假设是这样,这是一个如何将子类型映射到关系数据库的案例。通常有三种选择:

  • 选项1:每个子类型一个表, 具有重复的公共属性 每个表(名称、id等)
  • 选项2:所有对象的单表(您的单表方法)
  • 选项3:表用于超类型,每个子类型一个
没有普遍正确的解决方案。我通常倾向于从选项3开始;它提供了一个可使用的初始结构,非常规范化,并且可以轻松扩展。这意味着检索每个实例时只有一个联接,但RDBMS在进行联接时得到了很好的优化,因此在实践中不会真正导致性能问题

对于查询(无联接),选项2的性能更高,但如果其他表需要引用所有超类型实例(外键的激增),则会导致问题

选项1乍一看似乎是最有效的,尽管有两个警告:(1)它不能适应变化。如果添加新的子类型(以及其他不同的属性),则需要更改表结构并将其迁移。(2) 它的效率可能比看上去的要低。因为表填充是稀疏的,所以一些数据库不能特别有效地存储它。因此,它的效率可能不如选项1—因为查询引擎执行连接的速度比搜索膨胀的稀疏表空间的速度快

选择哪一个,归根结底是要了解问题的细节。我建议读一读这些选项:这是一个好的开始


hth

在我们进行合理讨论之前,某些问题需要澄清和解决

先决条件决议

  • 标签
    在一个要求精确的职业中,我们使用精确的标签非常重要,以避免混淆,这样我们就可以在不必使用冗长的描述和限定词的情况下进行交流。
    .
    您发布为FixedTables的内容未规范化。公平地说,这可能是第三种标准格式的尝试,但事实上它是一个平面文件,未规范化(而不是“非规范化”)。准确地说,您发布为AbstractTables的是实体属性值,这几乎是但不完全是第六范式,因此比3NF更规范化。当然,假设操作正确

    • 未规范化的平面文件不是“非规范化”的。它充满了重复(没有采取任何措施来删除重复组和重复列或解决依赖项)和空值,在许多方面它是性能消耗,并防止并发

    • 为了去规范化,必须首先对其进行规范化,然后出于某种充分的理由,规范化稍微后退。因为它最初没有规范化,所以不能去规范化。它只是不规范化

    • 它不能说是“为了性能”的非规范化,因为作为一个性能猪,它是性能的对立面。好吧,他们需要一个缺乏正式设计的理由,而“为了性能”就是这样。即使是最小的正式审查也暴露了这种误传(但是很少有人能提供,所以它仍然是隐藏的,直到他们找到一个局外人来解决,你猜到了,巨大的性能问题)

    • 标准化结构的性能远远好于非标准化结构。标准化结构越多(EAV/6NF)的性能越好于标准化结构越差(3NF/5NF)

    • 我同意OMG小马的主旨,但不同意它们的标签和定义

    • 我不是说“除非必须”,否则不要“去规范化”,而是说“忠实地规范化,周期”和“如果出现性能问题,您没有正确地规范化”。
  • 维基
    关于范式和规范化的条目完全是一个笑话。具体来说,定义是不正确的;它们混淆了范式;它们对规范化的过程一无所知;它们对很久以前就被揭穿的荒谬或可疑的NFs给予了同等的重视。其结果是,Wiki增加了一个已经混淆且很少被取消的概念理解主题。所以不要浪费时间。
    .
    然而,为了取得进展,在不造成阻碍的情况下,让我这样说

    • 3NF的定义是稳定的,没有改变
    • 在3NF和5NF之间有很多关于NFs的混淆。事实是,这是一个在过去15年中取得进展的领域;许多组织、学术界人士以及产品有局限性的供应商都在跳跃
      {
         "id": 1,
         "type":"Restaurant",
         "name":"Messy Joe",
         "address":"1 Main St.",
         "tags":["asian","fusion","casual"]
      }