Mysql 动态规范化表是否可行?
假设我的数据库跟踪鸟类目击事件(注意:我真的在抓拍桶底的例子) 这些字段是:Mysql 动态规范化表是否可行?,mysql,database-design,database-normalization,Mysql,Database Design,Database Normalization,假设我的数据库跟踪鸟类目击事件(注意:我真的在抓拍桶底的例子) 这些字段是: sighting_id | common_name | park_name | location | time | etc.... 虽然我假设公园总是在同一个位置,但这个网站就像一个电子表格。用户为每个条目输入park\u name和location。另外请注意,我的实际模式还有其他字段,它们也依赖于类似的“公园名称”(例如state) 我没有办法让用户预先定义公园,所以我无法提前知道它们。我是否应该尝试动态规范化这
sighting_id | common_name | park_name | location | time | etc....
虽然我假设公园总是在同一个位置,但这个网站就像一个电子表格。用户为每个条目输入park\u name
和location
。另外请注意,我的实际模式还有其他字段,它们也依赖于类似的“公园名称”(例如state)
我没有办法让用户预先定义公园,所以我无法提前知道它们。我是否应该尝试动态规范化这些数据?例如,我的程序是否应该自动填充一个parks
表,用park\u id
替换观鸟表中的park\u name和location列
我最担心的是性能。列出每一次目击都需要一个连接来填充公园和位置。此外,动态管理这一点几乎肯定需要比节省更多的资源。我可能需要一个Cron作业来消除孤立的公园,因为它们可能会在多次目击中被引用。这取决于您的使用情况。规范化方法(park是一个表)将简化以下查询:
- 每个公园有多少鸟类目击
- 在哪个公园你最有可能看到鸟XYZ
- 可能还有很多类似的问题
这是我的2美分,税后1美分。我在最初的“公园”示例中的2美分(与OP的实际问题相反): 反对尝试自动规范化park和location列的决定性论据是可用性(usability):当数据以可编辑的电子表格格式呈现给用户时,用户自然会认为每一行都可以独立编辑,因此这是欺骗性的(并可能最终导致混淆)如果某些列(如“位置”)实际上与公园关联,而不是与行关联
处理此类情况的典型模式是,在输入新公园时,仅提示用户提供公园的详细信息,并在“公园”表中创建一行。例如,如果公园列包含下拉框,则最后一个选项可以是“添加新公园”。或者,当用户输入一个无法识别的公园名称时,添加一个新的公园——但仍然要向用户明确新公园正在创建。这个“问题”似乎是从哪里冒出来的……应该(很可能)有一个
公园表。即使两个公园(比如在不同的州)有相同的名称,它们也是两个不同的公园(如前所述)这一点应该被捕获。从一个好的模型开始——在分析并确定它是一个问题之前,不要担心性能。改善性能比修复坏数据和“好模型”更容易如果不是更快的话,在这里也会一样快。我不在乎公园是否一样:这些数据只会被显示,不会被执行。我的实际问题(这只是一个类比,但我意识到这不是很好)处理姓名、性别和大学栏。我不一定关心两个人是否有相同的姓名、性别等。我只是想知道不复制此数据是否值得。除非有经验证的测试用例,否则不值得。保存少量记录(所有字段恰好对齐)事实上,这将更难维持——一个人的名字(和性别)可以独立于其他人(因此是独立的实体)而改变。这是非常正确的。如果一个人的名字(或性别)更改后,查找所有实际使用的名称以删除孤立的名称是一个疯狂的过程。请注意,我已澄清了我的原始问题,并提出了这个衍生问题:@Matthew:谢谢你的见解:)。我的实际问题(如我所说,这只是一个类比)更接近你的“姓氏”表示例。我要处理的字段是name、sex和university。让我们看看。name可以存储在单独的表中,但这太差劲了。所以我们不需要对其进行动态规范化。sex我会使用类似枚举的列(值1,2).出于风格的原因,避免将性别视为布尔值。现在,我会尝试对大学进行标准化,但这又取决于您如何进行查询。我将根据大学搜索行。我认为,如果我必须加入大学表,则该操作的效率将更低。如果您对大学进行标准化,您将拥有在用户进入您尚未拥有的大学时“及时”创建大学行。这是可行的,但处理竞争条件取决于一些部署条件。是否只涉及一个应用程序