如何定义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
相关产品推荐
相关产品推荐

