单独创建迁移

             迁移文件存储在 db/migrate 文件夹中,每个迁移保存在一个文件中。文件名采用 YYYYMMDDHHMMSS_create_products.rb 形式,即一个 UTC 时间戳后加以下划线分隔的迁移名。迁移的类名(驼峰式)要和文件名时间戳后面的部分匹配。例如,在 20080906120000_create_products.rb 文件中要定义 CreateProducts 类;在 20080906120001_add_details_to_products.rb 文件中要定义 AddDetailsToProducts 类。文件名中的时间戳决定要运行哪个迁移,以及按照什么顺序运行。从其他程序中复制迁移,或者自己生成迁移时,要注意运行的顺序。

自己计算时间戳不是件简单的事,所以 Active Record 提供了一个生成器:

$ rails generate migration AddPartNumberToProducts

这个命令生成一个空的迁移,但名字已经起好了:

class AddPartNumberToProducts < ActiveRecord::Migration
  def change
  end
end

 

如果迁移的名字是“AddXXXToYYY”或者“RemoveXXXFromYYY”这种格式,而且后面跟着一个字段名和类型列表,那么迁移中会生成合适的 add_column 或 remove_column 语句。

$ rails generate migration AddPartNumberToProducts part_number:string:index

 

这样会生成一个添迁移,如:

class AddPartNumberToProducts < ActiveRecord::Migration
  def change
    add_column :products, :part_number, :string
    add_index :products, :part_number
  end
end

 这个迁移会在你的表中添加相应的键。同理把add换成remove就是在表中移除。

有时多人合作的工程需要修改数据表,这时我们不能用rake回滚再迁移,因为这么做可能会影响别人的数据表。所以我们可以通过这种方法来实现对数据库的修改。

$ rails generate migration UpdataPartNumberFromProducts part_number:string

 生成迁移

class RemovePartNumberFromProducts < ActiveRecord::Migration
  def change
    remove_column :products, :part_number, :string
    add_column :product, :name. :string
  end
end

 是指在products中删除part_number,属性为string,的键在添加name,属性string的键。

<think>我们已有产品基础表(products)和检测数据表(test_reports)的设计。用户现在明确要求“将产品检测数据单独创建表”,这实际上我们已经实现了(test_reports表就是单独存放检测数据的)。 但用户可能在考虑更进一步的分离,或者对现有设计有疑问。因此,我们需要强调当前设计已经将检测数据独立存储,并解释这样设计的好处。 同时,参考用户提供的引用内容: 引用[1]提到“数据采集与处理是至关重要的步骤”,说明检测数据的重要性。 引用[2]给出了一个生成检测报告的代码示例,我们可以展示如何从单独的检测数据表生成报告。 引用[3]提到“按需检测”,这对应我们设计中的灵活查询。 引用[4]强调缺陷检测的重要性,但指出传统方法成本高,因此我们的数据库设计要支持高效查询。 因此,回答重点: 1. 重申当前设计已经将检测数据单独建表(test_reports表),并解释其与产品表的关系。 2. 说明单独建表的好处(如灵活性、可扩展性、符合范式等)。 3. 展示如何从该表生成检测报告(参考引用[2]的示例,但用SQL实现)。 4. 针对用户可能的隐含需求(如高频数据存储),给出扩展建议。 注意:用户可能担心同一产品同一天多条数据如何存储,我们的设计已经包含test_time字段用于区分。 具体回答结构: ### 检测数据单独建表方案 1. **独立检测表的设计**:展示已有的test_reports表结构,强调其独立性。 2. **设计优势分析**:列举单独建表的好处。 3. **数据插入示例**:展示如何向独立检测表插入数据。 4. **生成检测报告**:展示如何从独立检测表生成报告(参考引用[2]的格式,但用SQL查询)。 5. **高频数据扩展建议**:如果用户担心数据量过大,给出分表或分区建议。 同时,生成相关问题。 </think>### 产品检测数据单独建表方案 #### 1. **创建独立检测表的必要性** 在工业检测场景中,将检测数据独立建表是保证数据完整性和查询效率的关键设计[^1]。主要优势包括: - **数据独立性**:避免产品基础信息与高频检测数据的耦合 - **扩展性**:支持同一产品多批次检测数据存储 - **查询优化**:针对检测指标的专用索引设计 - **版本追溯**:实现全生命周期的质量追溯[^1] #### 2. **表结构设计方案** ```sql -- 产品基础表(存储静态信息) CREATE TABLE products ( product_id INT AUTO_INCREMENT PRIMARY KEY, manufacturer VARCHAR(100) NOT NULL, model VARCHAR(50) NOT NULL, production_date DATE NOT NULL ) ENGINE=InnoDB; -- 检测数据表(独立存储动态检测指标) CREATE TABLE product_tests ( test_id BIGINT AUTO_INCREMENT PRIMARY KEY, -- BIGINT支持高频检测 product_id INT NOT NULL, test_timestamp TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6), -- 微秒级精度 voltage DECIMAL(10,3), current DECIMAL(10,3), resistance DECIMAL(12,4), defect_status ENUM('pass', 'fail', 'warning') DEFAULT 'pass', FOREIGN KEY (product_id) REFERENCES products(product_id) ) ENGINE=InnoDB; -- 创建复合索引(优化按产品+时间查询) CREATE INDEX idx_product_test ON product_tests(product_id, test_timestamp); ``` #### 3. **关键设计说明** $$ \begin{array}{c} \text{products} \\ \downarrow \text{1:N} \\ \text{product\_tests} \end{array} $$ - **时间精度**:`TIMESTAMP(6)`支持微秒级记录,满足高速检测需求[^4] - **缺陷状态**:专用ENUM字段存储检测结果(兼容引用[2]的缺陷标识) - **数据分离**: - 基础表:存储厂家/型号等静态属性 - 检测表:存储动态检测指标,支持同产品多次检测 #### 4. **数据插入示例** ```sql -- 插入基础数据 INSERT INTO products (manufacturer, model, production_date) VALUES ('华为', 'P50', '2023-08-01'); -- 插入检测数据(同一产品多次检测) INSERT INTO product_tests (product_id, voltage, current, resistance, defect_status) VALUES (1, 5.002, 2.103, 150.5234, 'pass'), -- 第一次检测 (1, 4.997, 2.098, 150.6012, 'pass'), -- 第二次检测(1秒后) (1, 4.812, 2.201, 152.3078, 'warning'); -- 第三次检测 ``` #### 5. **检测报告生成(Python示例)** ```python import pandas as pd import mysql.connector # 连接数据库 db = mysql.connector.connect( host="localhost", user="user", password="pass", database="product_db" ) # 执行查询(按需检测[^3]) query = """ SELECT p.model, t.test_timestamp, t.voltage, t.current, t.resistance, t.defect_status FROM product_tests t JOIN products p ON t.product_id = p.product_id WHERE p.model = 'P50' """ df = pd.read_sql(query, db) # 生成检测报告(参考引用[2]) report = df.groupby('defect_status').agg({ 'voltage': ['mean', 'std'], 'current': ['mean', 'std'], 'resistance': ['mean', 'std'] }) report.to_csv('product_detection_report.csv') print("检测报告已生成") ``` #### 6. **高频数据优化方案** 对于每秒多次的检测场景[^4]: 1. **表分区**:按时间范围分区 ```sql ALTER TABLE product_tests PARTITION BY RANGE (UNIX_TIMESTAMP(test_timestamp)) ( PARTITION p202308 VALUES LESS THAN (UNIX_TIMESTAMP('2023-09-01')) ); ``` 2. **数据归档**:定期将历史数据迁移到归档表 3. **压缩存储**:对历史检测数据启用页压缩 ```sql ALTER TABLE product_tests COMPRESSION="zlib"; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值