4

方法一:

CREATE TABLE `ads` (
  `idads` int(11) NOT NULL AUTO_INCREMENT,
  `idobject` int(11) NOT NULL,
  `ad_type` enum('SALE','RENT','NEWHOUSING','GBUY','LAND','FIXMOVE') DEFAULT 'SALE',
)

CREATE TABLE `house` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` varchar(15) DEFAULT NULL,

选择“销售”数据

SELECT * FROM ads a JOIN house h on (h.id = a.idobject) WHERE a.ad_type = 'SALE';

方法二

CREATE TABLE `ads` (
  `idads` int(11) NOT NULL AUTO_INCREMENT,
  `uid` varchar(15),


CREATE TABLE `house` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` varchar(15) DEFAULT NULL,

选择“销售”数据:

 SELECT * FROM ads a JOIN house h on (a.uid=h.uid);

method2中的uid已经有了data_type的信息。

我有点混淆最佳实践:
Method1 似乎更快,但需要指定 ad_type = 'SALE';
Method2似乎更简单,只需要加入uid,但似乎更慢?是真的吗?

哪一个是最佳实践?哪个性能更好?或者根本没有什么不同?
PS。我将餐桌广告标准化,因为它将与餐桌屋、餐桌土地、餐桌新房等连接在一起。餐桌广告将存储 ads_start_date、ads_end_date 和其他有用信息。

4

2 回答 2

1

处理此类设计问题的最有用的方法是考虑您的应用程序是否需要能够同时处理您所有的ads——无论是销售、租金、土地等——。如果您需要这样做,您的第一个选择是最佳选择。

如果将土地广告、出租物业广告等放在他们自己的表格中更有意义,那么您的第二种选择是最好的。house看来你已经用你的桌子做了那种事情。但这是我的猜测。

当您可以轻松地加入普通的自动增量列时,加入 uuid并不是最佳实践。id当您拥有一个非常好的唯一键时,使用 uuid 作为代理唯一键'id只是额外的工作和存储。

最佳做法是统一命名您的 id 列 - 您的主键列。即house.house_idhouse表中和表ads.house_id中使用ads。当你这样做时,阅读和检查你的 SQL 代码会更容易。

于 2013-09-18T11:53:28.047 回答
1

如果您在表中有自动增量id,我强烈建议您将其设为主键:

CREATE TABLE `ads` (
  `idads` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
------------------------------------------^
  `idobject` int(11) NOT NULL,
  `ad_type` enum('SALE','RENT','NEWHOUSING','GBUY','LAND','FIXMOVE') DEFAULT 'SALE',
);

作为一般规则,我赞成第一种方法。自动递增的主键没有附加信息,例如嵌入ad_type代码。在第二种方法中,称为“uid”的东西(我认为它实际上应该是“用户 id”)有两个目的。它试图成为一个唯一的键,并试图对类型信息进行编码。

我强烈赞成将类型信息作为显式列。

于 2013-09-18T11:54:54.697 回答