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:表用于超类型,每个子类型一个
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"] }