说我有两张桌子。一,让我们称之为 typeDB ,对于包含索引,类型名称和另一个表中此类型的元素的ID列表的行具有。要获取第二个表中的行 - 我们称之为 dataDB - 类型为0,我基本上可以做(在草率的伪代码中):
$list = SELECT list FROM typeDB WHERE index=0
然后我可以使用:
从dataDB获取行$array = explode($list)
for (every element of list $i)
$results = SELECT * FROM dataDB WHERE index=$array[$i]
所以我的问题是......这比仅仅在dataDB中有一个类型字段,然后做:
$results = SELECT * FROM dataDB WHERE type=$type
我的想法是,因为第一种方法不必遍历整个数据库,所以会更快。但我真的不知道数据库查询是如何工作的。您认为哪种方式最有效?感谢。
答案 0 :(得分:1)
在type列上添加索引并使用第二个版本,它会快得多。 另请注意,我认为您对数据库的含义感到困惑。数据库是表的集合(以及触发器,存储过程,视图等),因此使用名称somethingDB命名表有点令人困惑。 当我说索引时我指的是数据库索引(与看起来像你所谓的索引的列无关)。
创建列和索引你使用这样的东西(对于mysql)
ALTER TABLE dataDB ADD COLUMN `type` varchar(64)
CREATE INDEX type_index ON dataDB(type)
与其他DBMS相似
在评论中提到,然后您需要加入类型列。 您可以拥有一个具有类型和自动增量ID的表以及类型/名称字段上的唯一约束。然后使用自动增量ID作为外键,或者只使用一列(类型)创建一个类型表是主键。无论哪种方式都有效,两者都有好处(我会选择自动增量列,因为我相信它在代码中更灵活)。
如果您确实选择了自动增量列,则可以使用:
CREATE TABLE dataType (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(64) UNIQUE
)
ALTER TABLE dataDB ADD COLUMN `type` INT;
ALTER TABLE dataDB ADD CONSTRAINT fk_type FOREIGN KEY (type) REFERENCES dataType(id);
然后当你想要查询dataDB时,如果你想要类型名称(而不是整数),你会像这样进行连接:
SELECT dataDB.list, dataType.name FROM dataDB
INNER JOIN dataType ON dataDB.type=dataType.id
where dataDB.type="$type"
这假设类型是某种名称而不是开头的整数,如果它们一直是整数,只需将int值作为dataType表的唯一列,因此它就是你的主键。