You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义SQL数据库表并建立关联关系?CSV转三表结构SQL数据库的设计疑问

我来帮你梳理下这个数据库设计的思路,解决你提到的主键、关联关系以及冗余字段的疑问:

数据库表设计方案

1. Stock表(存储唯一股票基础信息)

这个表的核心作用是存储不重复的股票代码(Ticker),因为每个Ticker对应一支唯一的股票,设计非常明确:

  • 主键:Ticker(天然唯一,适合作为主键)
  • 建表SQL示例:
CREATE TABLE Stock (
    Ticker VARCHAR(10) PRIMARY KEY,
    -- 可按需扩展其他股票基础字段,比如公司名称、所属行业等
    CompanyName VARCHAR(100) NULL,
    Industry VARCHAR(50) NULL
);

你只需要把CSV里的唯一Ticker(xyz、abc)插入这个表,确保没有重复值即可。

2. Price表(存储每日股票价格)

针对你提到的「所有列均可能重复」的问题,结合业务逻辑来看:同一支股票(Ticker)在同一天(Date)只会有一条有效价格记录,所以可以用**复合主键(Ticker, Date)**来保证数据唯一性,同时通过外键关联Stock表:

  • 主键:复合主键(Ticker, Date)
  • 外键:Ticker引用Stock表的Ticker主键,建立关联
  • 建表SQL示例:
CREATE TABLE Price (
    Ticker VARCHAR(10),
    Date DATE,
    Price DECIMAL(10,2),
    PRIMARY KEY (Ticker, Date),
    FOREIGN KEY (Ticker) REFERENCES Stock(Ticker)
        ON DELETE CASCADE ON UPDATE CASCADE
);

这样设计既避免了同一股票同一天出现多条价格记录,又和Stock表建立了依赖关系,删除/更新Stock表的Ticker时,Price表的对应记录会同步处理(可根据业务需求调整外键规则)。

3. RSI表(存储每日RSI指标)

你问的「能否删除已存储在Price表中的Ticker、Date、Price字段」——完全可以,而且非常推荐!这是遵循数据库设计**第三范式(3NF)**的做法,能避免数据冗余:

  • 不需要存储Price:Price已经在Price表里,我们可以通过Ticker+Date关联获取,重复存储会增加维护成本(比如Price更新时,还要同步改RSI表)
  • 主键:复合主键(Ticker, Date)(同一股票同一天的RSI是唯一的)
  • 外键:(Ticker, Date)引用Price表的复合主键(Ticker, Date),间接关联Stock表
  • 建表SQL示例:
CREATE TABLE RSI (
    Ticker VARCHAR(10),
    Date DATE,
    RSI INT,
    PRIMARY KEY (Ticker, Date),
    FOREIGN KEY (Ticker, Date) REFERENCES Price(Ticker, Date)
        ON DELETE CASCADE ON UPDATE CASCADE
);

关联关系总结

  • Stock是基础表,Price表依赖Stock表(通过Ticker外键)
  • RSI表依赖Price表(通过Ticker+Date复合外键),间接关联Stock表
  • 整体依赖链:Stock → Price → RSI

数据查询示例

如果需要获取完整的股票、价格、RSI信息,可以通过JOIN实现:

SELECT s.Ticker, p.Date, p.Price, r.RSI
FROM Stock s
JOIN Price p ON s.Ticker = p.Ticker
JOIN RSI r ON p.Ticker = r.Ticker AND p.Date = r.Date;

内容的提问来源于stack exchange,提问作者mmmmm5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:22:38