我有一个feed
表,其中包含以下字段:
id
- 唯一Feed标识created
- 创建Feed的日期table
- 其余Feed信息所在的表格的名称然后我说了2个表:feed_image
和feed_text
。现在这两个表包含有关Feed,不同字段的不同信息。
如何(在MySQL中)从feed.table
中指定名称的相应表格中提取Feed的信息?
以下是我的架构的样子:
+------------------+
| table_a |
+---------------------+ |------------------|
| feed | | id |
|---------------------| +------+ feed_id |
| id <-------------------+-+ | field_in_a |
| created | | | ... |
| table | | | |
| | | | |
| | | | |
| | | +------------------+
+---------------------+ |
|
|
| +-------------------+
| | table_b |
| |-------------------|
| | id |
+--------+ feed_id |
| field_in_b |
| ... |
| |
| |
| |
| |
+-------------------+
每个Feed都存在于table_a或table_b或table_c或...中(我有30个)。 如何指定从哪个表中提取信息(每个表具有不同的结构)。
或者,如果我在每个table_*.feed_id
上添加索引并将其映射到feed.id
,那么InnoDB会做一些魔术,所以当我加入它们时,它只会看到其中一个,而不是所有30个?
我的最新想法是只有一个表feed
和一个字段feed.content
,我将存储一个不同PHP类的序列化PHP对象,表示不同的Feed类型及其各自的内容。
关于表现的最佳方式是什么?
P.S。:单个参数不需要选择/搜索/排序记录,只需created
。这个想法应该能够与1 000 000+记录很好地配合。
更新:
澄清30+ table_a / b / c ..
每个Feed可能有太多不同的类型(新的也会随时间添加):
url
字段text
字段title
,VARCHAR(255)video_id
字段x1
,* x2
,* x3
...字段然后将根据类型使用PHP显示每个Feed:
答案 0 :(得分:3)
我会使用LEFT JOIN并在select中为我的列添加别名,并在联接中为我的表添加别名,以便您返回所需的所有信息。
无论使用何种语言,您可以根据需要对结果进行分组并执行逻辑。
更新:
为什么你有30张桌子?也许有一个“meta”表,其中包含来自等的Feed创建日期url ...以及另一个包含唯一记录ID,Feed id,内容,内容类型的表。
通过这种方式,您可以加入一个表格,其中Feed ID匹配,也可以按内容类型分组或过滤。
可视化:Feed表
--------------------------------------------------------------
| feed_id | feed_name | feed_created | Feed_url |
--------------------------------------------------------------
| 1 | Feed 1 | 03/28/2012 | www.go.com |
--------------------------------------------------------------
| 2 | Feed 1 | 03/28/2012 | www.be.com |
--------------------------------------------------------------
| 3 | Feed 2 | 03/28/2012 | www.hi.com |
--------------------------------------------------------------
| 4 | Feed 3 | 03/28/2012 | www.ex.com |
--------------------------------------------------------------
可视化:Feed资源表
------------------------------------------------------------------------------------------------
| rec_id | feed_id | content | type |
------------------------------------------------------------------------------------------------
| 1 | 1 | 'hello world! | text |
--------------------------------------------------------------------------------------
| 2 | 3 | 'http://me.com/my-image | img |
------------------------------------------------------------------------------------------------
| 3 | 2 |{\'title\':\'VIDEO\',\'url\':\'http://me.com/1.mov\'}| vid |
------------------------------------------------------------------------------------------------
| 4 | 1 | 'Wow that was easy!' | text |
------------------------------------------------------------------------------------------------
答案 1 :(得分:2)
你不能做这样的事情:
+------------------+
| table_a |
+---------------------+ |------------------|
| feed | | id |
|---------------------| +------+ feed_id |
| id <-------------------+-+ | field_in_a |
| created | | | ... |
| | | | |
| | | | |
| | | | |
| | | +------------------+
+---------------------+ |
|
|
| +-------------------+
| | table_b |
| |-------------------|
| | id |
+--------+ feed_id |
| field_in_b |
| ... |
| |
| |
| |
| |
+-------------------+
然后加入table_a
和table_b
的记录? MySQL非常高效。
答案 2 :(得分:1)
您应该创建一个标准化的布局,如d_inevitable建议的那样。
您还没有告诉我们您是如何显示这些数据的。但是您可以使用select * from feed获取所有Feed的列表;
然后,您可以通过搜索其他表格获取Feed的其他数据。对于您的网址示例,如果table_a = URL和field_in_a =网址
无论您使用哪种Feed,都会搜索包含该Feed的ID的网址。 从feed_id =“id”的网址中选择* 这将允许每个Feed具有与其关联的1到多个URL。 您可以为与Feed关联的每种数据类型执行此操作。 “feed_id”是您用来引用它的外键的外键。
关键是要归结为你如何展示它。 你需要遍历所有的Feeds,然后适当地构建一个表(?)。
如果Feed有两个网址,您希望它看起来怎么样?
是否应显示
------------------------------------------------- | Feed Name | Feed Created | URL | ------------------------------------------------- | Feed 1 | 03/28/2012 | www.go.com | ------------------------------------------------- | Feed 1 | 03/28/2012 | www.be.com | ------------------------------------------------- | Feed 2 | 03/28/2012 | www.hi.com | ------------------------------------------------- | Feed 3 | 03/28/2012 | | -------------------------------------------------
或
------------------------------------------------- | Feed Name | Feed Created | URL | ------------------------------------------------- | Feed 1 | 03/28/2012 | www.go.com | | | | www.be.com | ------------------------------------------------- | Feed 2 | 03/28/2012 | www.hi.com | ------------------------------------------------- | Feed 3 | 03/28/2012 | | -------------------------------------------------
我认为数据布局应该是d_inevitable建议的,然后你需要确定如何显示数据,这将决定你如何查询它。