Новый TECDOC 2Q2017/3Q2017

tecdocru
Дата: 17.06.2017 10:10:12
С 2017 года TECDOC полностью поменял структуру. У 99% начавших работу с новым текдоком, возникли трудности с запросами к базе mySQL. По просьбам страждущих, выкладываю готовый php-класс для работы с новыми версиями базы.

<?php
// (c) tecdoc.ru
error_reporting( E_ALL );
ini_set( 'display_errors', 1 );
	
class DBase {
	
	const HOST 	= '';
	const USER 	= '';
	const PASS 	= '';
	const NAME 	= '';
	
    private static $instance;
		
    public static function instance()
    {
        if (!isset(DBase::$instance)) {
            $db = array(
                'host' => static::HOST,
                'user' => static::USER,
                'pass' => static::PASS,
                'name' => static::NAME,
            );
            self::connect($db);
        }
        return DBase::$instance;
    }
 
 //	$asArray - возвращать объект или массив
 
    public static function select($query, $asArray = false)
    {
        $mysqli_result = self::instance()->query($query);
        if ($mysqli_result) {
            $r = array();
            while ($row = $mysqli_result->fetch_object()) {
                $r[] = $asArray ? (array) $row : $row;
            } 
            return $r;
        }
        return array();
    }
 
    public static function selectRow($query, $asArray = false)
    {
        $mysqli_result = self::instance()->query($query);
        if ($mysqli_result) {
            $row = $mysqli_result->fetch_row();
            if ($row) {
                if ($asArray) {
                    return (array) $row;
                }
                else {
                    return $row;
                }
            }
        }
        return array();
    }
 
    public static function selectCol($query)
    {
        $rows = self::select($query,true); 
        return array_map(function ($row) {return array_shift($row);}, $rows);
    }
 
    public static function selectCell($query)
    {
        $mysqli_result = self::instance()->query($query);
        if($mysqli_result) {
            $row = $mysqli_result->fetch_row();
            if ($row) {
                return $row[0];
            }
        }
        return NULL;
    }
 
    public static function query($query)
    {
        return self::instance()->query($query);
    }

    public static function connect(array $db)
    {
        $mysqli = new mysqli($db['host'], $db['user'], $db['pass'], $db['name']);
 
        if (!$mysqli->connect_error) {
			$mysqli->set_charset("utf8");
            DBase::$instance = $mysqli;
        }
        return $mysqli;
    }
}

class Tecdoc extends DBase {
	
	
//====================================//
// (1) АВТОМОБИЛИ
//===================================//
	
	
	// (1.1) Марки авто (производители)
	static function getMakes( $type )
		{
			switch ($type) {
			case 'passenger':
				$where = " AND ispassengercar = 'True'";
				break;
			case 'commercial':
				$where = " AND iscommercialvehicle = 'True'";
				break;
			case 'motorbike':
				$where = " AND ismotorbike  = 'True' AND haslink = 'True'";
				break;
			case 'engine':
				$where = " AND isengine = 'True'";
				break;
			case 'axle':
				$where = " AND isaxle = 'True'";
				break;

			}
			
			$order = $type == 'motorbike' ? 'description' : 'matchcode';
			
			return parent::select("
				SELECT id, description name
				FROM manufacturers
				WHERE canbedisplayed = 'True' " . $where . "
				ORDER BY " . $order);
		} 
		
	// (1.2) Модели авто 	
	static function getModels( $make_id, $type, $pattern = null )
		{
		
			switch ($type) {
			case 'passenger':
				$where = " AND ispassengercar = 'True'";
				break;
			case 'commercial':
				$where = " AND iscommercialvehicle = 'True'";
				break;
			case 'motorbike':
				$where = " AND ismotorbike  = 'True'";
				break;
			case 'engine':
				$where = " AND isengine = 'True'";
				break;
			case 'axle':
				$where = " AND isaxle = 'True'";
				break;

			}
			
			if( $pattern != null ) $where .= " AND description LIKE '" . $pattern . "%'";

			return parent::select("
				SELECT id, description name, constructioninterval
				FROM models
				WHERE canbedisplayed = 'True'
				AND manufacturerid = " . (int)$make_id . " " . $where . "
				ORDER BY description");
		}
	
	// (1.3) Модификации авто 
	static function getModifications( $model_id, $type ){
        switch ($type) {
			case 'passenger':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM passanger_cars pc 
					LEFT JOIN passanger_car_attributes a on pc.id = a.passangercarid
					WHERE canbedisplayed = 'True'
					AND modelid = " . (int)$model_id . " AND ispassengercar = 'True'");
				break;
			case 'commercial':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM commercial_vehicles cv 
					LEFT JOIN commercial_vehicle_attributes a on cv.id = a.commercialvehicleid
					WHERE canbedisplayed = 'True'
					AND modelid = " . (int)$model_id . " AND iscommercialvehicle = 'True'");
				break;
			case 'motorbike':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM motorbikes m 
					LEFT JOIN motorbike_attributes a on m.id = a.motorbikeid
					WHERE canbedisplayed = 'True'
					AND modelid = " . (int)$model_id . " AND ismotorbike = 'True'");
				break;
			case 'engine':
				return parent::select("
					SELECT id, fulldescription name, salesDescription, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM engines e 
					LEFT JOIN engine_attributes a on e.id= a.engineid
					WHERE canbedisplayed = 'True'
					AND manufacturerId = " . (int)$model_id . " AND isengine = 'True'");
				break;
			case 'axle':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM axles ax 
					LEFT JOIN axle_attributes a on ax.id= a.axleid
					WHERE canbedisplayed = 'True'
					AND modelid = " . (int)$model_id . " AND isaxle = 'True'");
				break;

			}
    }
	
	// (1.4) Марка по ID
	static function getMake( $id, $type )
		{
			switch ($type) {
			case 'passenger':
				$where = " AND ispassengercar = 'True'";
				break;
			case 'commercial':
				$where = " AND iscommercialvehicle = 'True'";
				break;
			case 'motorbike':
				$where = " AND ismotorbike  = 'True' AND haslink = 'True'";
				break;
			case 'engine':
				$where = " AND isengine = 'True'";
				break;
			case 'axle':
				$where = " AND isaxle = 'True'";
				break;

			}
			return parent::select("
				SELECT id, description name
				FROM manufacturers
				WHERE canbedisplayed = 'True' " . $where . " AND id = " . (int)$id . ";
			");
		} 	
		
	// (1.5) Модель по ID
	static function getModel( $id, $type ){
		
			switch ($type) {
				case 'passenger':
					$where = " AND ispassengercar = 'True'";
					break;
				case 'commercial':
					$where = " AND iscommercialvehicle = 'True'";
					break;
				case 'motorbike':
					$where = " AND ismotorbike  = 'True'";
					break;
				case 'engine':
					$where = " AND isengine = 'True'";
					break;
				case 'axle':
					$where = " AND isaxle = 'True'";
					break;

				}
				
			return parent::select("
				SELECT id, description name, constructioninterval
				FROM models
				WHERE canbedisplayed = 'True' " . $where . " AND id = " . (int)$id . "
			");
    }
	
	// (1.6) Модификация по ID
	static function getType( $id, $type ){
        switch ($type) {
			case 'passenger':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM passanger_cars pc 
					LEFT JOIN passanger_car_attributes a on pc.id = a.passangercarid
					WHERE canbedisplayed = 'True'
					AND id = " . (int)$id . " AND ispassengercar = 'True'");
				break;
			case 'commercial':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM commercial_vehicles cv 
					LEFT JOIN commercial_vehicle_attributes a on cv.id = a.commercialvehicleid
					WHERE canbedisplayed = 'True'
					AND id = " . (int)$id . " AND iscommercialvehicle = 'True'");
				break;
			case 'motorbike':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM motorbikes m 
					LEFT JOIN motorbike_attributes a on m.id = a.motorbikeid
					WHERE canbedisplayed = 'True'
					AND id = " . (int)$id . " AND ismotorbike = 'True'");
				break;
			case 'engine':
				return parent::select("
					SELECT id, fulldescription name, salesDescription, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM engines e 
					LEFT JOIN engine_attributes a on e.id = a.engineid
					WHERE canbedisplayed = 'True'
					AND id = " . (int)$id . " AND isengine = 'True'");
				break;
			case 'axle':
				return parent::select("
					SELECT id, fulldescription name, a.attributegroup, a.attributetype, a.displaytitle, a.displayvalue
					FROM axles ax 
					LEFT JOIN axle_attributes a on ax.id = a.axleid
					WHERE canbedisplayed = 'True'
					AND id = " . (int)$id . " AND isaxle = 'True'");
				break;

			}
    }
	
//====================================//
// (2) Дерево категорий / разделы
//===================================//

	// (2.1) Построение дерева категорий изделий для заданного типа автомобиля (от родительского)
	/*
	Последовательно устанавливая следующие значения parentid, можно получить ещё 4 уровня дерева
	havechild -  Есть ли у этой категории подкатегории: 1 - Есть, 0 - Нет
	Если есть, то ее parentid ставим на вход метода
	*/
	static function getSections( $modification_id, $type, $parent=0 )
		{
			switch ($type) {
				case 'passenger':
					return parent::select("
						SELECT id, description, 
						IF(EXISTS(SELECT * FROM passanger_car_trees t1 
						INNER JOIN passanger_car_trees t2 ON t1.parentid=t2.id WHERE t2.parentid=" . (int)$parent . " AND t1.passangercarid=" . (int)$modification_id . " LIMIT 1), 1, 0) AS havechild 
						FROM passanger_car_trees WHERE passangercarid=" . (int)$modification_id . " AND parentId=" . (int)$parent . "
						ORDER BY havechild
					");
					break;
				case 'commercial':
					return parent::select("
						SELECT id, description, 
						IF(EXISTS(SELECT * FROM commercial_vehicle_trees t1 
						INNER JOIN commercial_vehicle_trees t2 ON t1.parentid=t2.id WHERE t2.parentid=" . (int)$parent . " AND t1.commercialvehicleid=" . (int)$modification_id . " LIMIT 1), 1, 0) AS havechild 
						FROM commercial_vehicle_trees WHERE commercialvehicleid=" . (int)$modification_id . " AND parentId=" . (int)$parent . "
						ORDER BY havechild
					");
					break;
				case 'motorbike':
					return parent::select("
						SELECT id, description, 
						IF(EXISTS(SELECT * FROM motorbike_trees t1 
						INNER JOIN motorbike_trees t2 ON t1.parentid=t2.id WHERE t2.parentid=" . (int)$parent . " AND t1.motorbikeid=" . (int)$modification_id . " LIMIT 1), 1, 0) AS havechild 
						FROM motorbike_trees WHERE motorbikeid=" . (int)$modification_id . " AND parentId=" . (int)$parent . "
						ORDER BY havechild
					");
					break;
				case 'engine':
					return parent::select("
						SELECT id, description, 
						IF(EXISTS(SELECT * FROM engine_trees t1 
						INNER JOIN engine_trees t2 ON t1.parentid=t2.id WHERE t2.parentid=" . (int)$parent . " AND t1.engineid=" . (int)$modification_id . " LIMIT 1), 1, 0) AS havechild 
						FROM engine_trees WHERE engineid=" . (int)$modification_id . " AND parentId=" . (int)$parent . "
						ORDER BY havechild
					");
					break;
				case 'axle':
					return parent::select("
						SELECT id, description, 
						IF(EXISTS(SELECT * FROM axle_trees t1 
						INNER JOIN axle_trees t2 ON t1.parentid=t2.id WHERE t2.parentid=" . (int)$parent . " AND t1.axleid=" . (int)$modification_id . " LIMIT 1), 1, 0) AS havechild 
						FROM axle_trees WHERE axleid=" . (int)$modification_id . " AND parentId=" . (int)$parent . "
						ORDER BY havechild
					");
					break;

				}
		}
		
	// (2.2) Название раздела по ID - используется в СЕО
	static function getSectionName( $section_id, $type )
		{
			switch ($type) {
				case 'passenger':
					return parent::selectCell("SELECT description FROM passanger_car_trees WHERE id=" . (int)$section_id . " LIMIT 1");
					break;
				case 'commercial':
					return parent::selectCell("SELECT description FROM commercial_vehicle_trees WHERE id=" . (int)$section_id . " LIMIT 1");
					break;
				case 'motorbike':
					return parent::selectCell("SELECT description FROM motorbike_trees WHERE id=" . (int)$section_id . " LIMIT 1");
					break;
				case 'engine':
					return parent::selectCell("SELECT description FROM engine_trees WHERE id=" . (int)$section_id . " LIMIT 1");
					break;
				case 'axle':
					return parent::selectCell("SELECT description FROM axle_trees WHERE id=" . (int)$section_id . " LIMIT 1");
					break;

				}
		}

	// (2.3) Поиск запчастей раздела
	static function getSectionParts( $modification_id, $section_id, $type )
		{
			switch ($type) {
				case 'passenger':
					return parent::select(" SELECT al.datasupplierarticlenumber part_number, s.description supplier_name, prd.description product_name
											FROM article_links al 
											JOIN passanger_car_pds pds on al.supplierid = pds.supplierid
											JOIN suppliers s on s.id = al.supplierid
											JOIN passanger_car_prd prd on prd.id = al.productid
											WHERE al.productid = pds.productid
											AND al.linkageid = pds.passangercarid
											AND al.linkageid = " . (int)$modification_id . "
											AND pds.nodeid = " . (int)$section_id . "
											AND al.linkagetypeid = 2
											ORDER BY s.description, al.datasupplierarticlenumber");
					break;
				case 'commercial':
					return parent::select(" SELECT al.datasupplierarticlenumber part_number, s.description supplier_name, prd.description product_name
											FROM article_links al 
											JOIN commercial_vehicle_pds pds on al.supplierid = pds.supplierid
											JOIN suppliers s on s.id = al.supplierid
											JOIN commercial_vehicle_prd prd on prd.id = al.productid
											WHERE al.productid = pds.productid
											AND al.linkageid = pds.commertialvehicleid
											AND al.linkageid = " . (int)$modification_id . "
											AND pds.nodeid = " . (int)$section_id . "
											AND al.linkagetypeid = 16
											ORDER BY s.description, al.datasupplierarticlenumber");
					break;
				case 'motorbike':
					return parent::select(" SELECT al.datasupplierarticlenumber part_number, s.description supplier_name, prd.description product_name
											FROM article_links al 
											JOIN motorbike_pds pds on al.supplierid = pds.supplierid
											JOIN suppliers s on s.id = al.supplierid
											JOIN motorbike_prd prd on prd.id = al.productid
											WHERE al.productid = pds.productid
											AND al.linkageid = pds.motorbikeid
											AND al.linkageid = " . (int)$modification_id . "
											AND pds.nodeid = " . (int)$section_id . "
											AND al.linkagetypeid = 777
											ORDER BY s.description, al.datasupplierarticlenumber");
					break;
				case 'engine':
					return parent::select(" SELECT pds.engineid, al.datasupplierarticlenumber part_number, prd.description product_name, s.description supplier_name
											FROM article_links al 
											JOIN engine_pds pds on al.supplierid = pds.supplierid
											JOIN suppliers s on s.id = al.supplierid
											JOIN engine_prd prd on prd.id = al.productid
											WHERE al.productid = pds.productid
											AND al.linkageid = pds.engineid
											AND al.linkageid = " . (int)$modification_id . "
											AND pds.nodeid = " . (int)$section_id . "
											AND al.linkagetypeid = 14
											ORDER BY s.description, al.datasupplierarticlenumber");
					break;
				case 'axle':
					return parent::select(" SELECT pds.axleid, al.datasupplierarticlenumber part_number, prd.description product_name, s.description supplier_name
											FROM article_links al 
											JOIN axle_pds pds on al.supplierid = pds.supplierid
											JOIN suppliers s on s.id = al.supplierid
											JOIN axle_prd prd on prd.id = al.productid
											WHERE al.productid = pds.productid
											AND al.linkageid = pds.axleid
											AND al.linkageid = " . (int)$modification_id . "
											AND pds.nodeid = " . (int)$section_id . "
											AND al.linkagetypeid = 19
											ORDER BY s.description, al.datasupplierarticlenumber");
					break;

				}
		}
		
//====================================//
// (3) Информация об изделии
//===================================//	
	
	// (3.1) Оригинальные номера
	static function getOemNumbers( $number, $brand_id )
		{
			return parent::select("
					SELECT m.description, a.OENbr FROM article_oe a 
					JOIN manufacturers m ON m.id=a.manufacturerId 
					WHERE a.datasupplierarticlenumber='" . $number . "' AND a.supplierid='" . $brand_id . "'
				");
		}		
		
	// (3.2) Статус изделия
	static function getArtStatus( $number, $brand_id )
		{
			return parent::select("
					SELECT NormalizedDescription, ArticleStateDisplayValue FROM articles WHERE DataSupplierArticleNumber='" . $number . "' AND supplierId='" . $brand_id . "'
				");
		}	
		
	// (3.3) Характеристики изделия
	static function getArtAttributes( $number, $brand_id )
		{
			return parent::select("
					SELECT attributeinformationtype, displaytitle, displayvalue FROM article_attributes WHERE datasupplierarticlenumber='" . $number . "'  AND a.supplierid='" . $brand_id . "'
				");
		}	
		
	// (3.4) Файлы изделия
	static function getArtFiles( $number, $brand_id )
		{
			return parent::select("
					SELECT Description, PictureName FROM article_images WHERE DataSupplierArticleNumber='" . $number . "'  AND a.supplierId='" . $brand_id . "'
				");
		}
		
	// (3.5) Применимость изделия
	static function getArtVehicles( $number, $brand_id )
		{
			$result = [];
			$rows = parent::select("
					SELECT linkageTypeId, linkageId FROM article_li WHERE DataSupplierArticleNumber='" . $number . "' AND supplierId='" . $brand_id . "'
				");
			foreach ( $rows as &$row ){
				switch ($type) {
				case 'PassengerCar':
					$result[ $row['linkageTypeId'] ][] =  parent::select("SELECT DISTINCT p.id, mm.description make, m.description model, p.constructioninterval, p.description FROM passanger_cars p 
																			JOIN models m ON m.id=p.modelid
																			JOIN manufacturers mm ON mm.id=m.manufacturerid
																			WHERE p.id=" . $row['linkageTypeId'] );
					break;
				case 'CommercialVehicle':
					$result[ $row['linkageTypeId'] ][] = parent::select("SELECT DISTINCT p.id, mm.description make, m.description model, p.constructioninterval, p.description FROM commercial_vehicles p 
																			JOIN models m ON m.id=p.modelid
																			JOIN manufacturers mm ON mm.id=m.manufacturerid
																			WHERE p.id=" . $row['linkageTypeId'] );
					break;
				case 'Motorbike':
					$result[ $row['linkageTypeId'] ][] = parent::select("SELECT DISTINCT p.id, mm.description make, m.description model, p.constructioninterval, p.description FROM motorbikes p 
																			JOIN models m ON m.id=p.modelid
																			JOIN manufacturers mm ON mm.id=m.manufacturerid
																			WHERE p.id=" . $row['linkageTypeId'] );
					break;
				case 'Engine':
					$result[ $row['linkageTypeId'] ][] = parent::select("SELECT DISTINCT p.id, m.description make, '' model, p.constructioninterval, p.description FROM `engines` p 
																			JOIN manufacturers m ON m.id=p.manufacturerid
																			WHERE p.id=" . $row['linkageTypeId'] );
					break;
				case 'Axle':
					$result[ $row['linkageTypeId'] ][] = parent::select("SELECT DISTINCT p.id, mm.description make, m.description model, p.constructioninterval, p.description FROM axles p 
																			JOIN models m ON m.id=p.modelid
																			JOIN manufacturers mm ON mm.id=m.manufacturerid
																			WHERE p.id=" . $row['linkageTypeId'] );
					break;

				}				
			}
			return $result;
		}	
		
	// (3.6) Замены изделия
	static function getArtReplace( $number, $brand_id )
		{
			return parent::select("
					SELECT s.description supplier, a.replacenbr number FROM article_rn a 
					JOIN suppliers s ON s.id=a.replacesupplierid
					WHERE a.datasupplierarticlenumber='" . $number . "' AND a.supplierid='" . $brand_id . "'
				");
		}
		
	// (3.7) Аналоги-заменители
	static function getArtCross( $number, $brand_id )
		{
			return parent::select("
					SELECT DISTINCT s.description, c.PartsDataSupplierArticleNumber FROM article_oe a 
					JOIN manufacturers m ON m.id=a.manufacturerId 
					JOIN article_cross c ON c.OENbr=a.OENbr
					JOIN suppliers s ON s.id=c.SupplierId
					WHERE a.datasupplierarticlenumber='". $number ."' AND a.supplierid='" . $brand_id . "'
				");
		}	
		
	// (3.8) Комплектующие (части) изделия
	static function getArtParts( $number, $brand_id )
		{
			return parent::select("
					SELECT DISTINCT description Brand, Quantity, PartsDataSupplierArticleNumber FROM article_parts 
					JOIN suppliers ON id=PartsSupplierId
					WHERE DataSupplierArticleNumber='". $number ."' AND supplierId='" . $brand_id . "'
				");
		}
}

//$foo = Tecdoc::getMakes('passenger');
//echo '<pre>';
//print_r($foo);
//echo '</pre>';
// (c) tecdoc.ru
?>


Саму базу mySQL можно получить здесь.
seomoneys
Дата: 17.06.2017 12:01:20
tecdocru,

У Вас не база, а какой-то винегрет:

1) В обход нормальным формам, некоторые сущности дублируются множества раз, вместо того чтобы быть объявлены один раз с первичным ключем и ссылаться на них через этот первичный ключ.

2) Использование VARCHAR поля `datasupplierarticlenumber` в качестве индекса, на таблицах объемом в 150-200 млн. строк, раздувает вашу базу до 200 ГБ. И к тому же дает неоднозначность привязки данных, поскольку datasupplierarticlenumber не уникален и у Вас есть вероятность получить таким образом данные для других артиклей.

3) Некоторые поля лишены логического смысла, к примеру `axles`.`iscommercialvehicle`, `axles`.`iscvmanufacturerid`, `axles`.`isengine`, `axles`.`ismotorbike`, `axles`.`ispassengercar`, `axles`.`istransporter` всегда будут 0(false) а `axles`.`isaxle` 1(true). Тоже самое и в других таблицах.

4) Вы выгрузили поля, которые относятся к ограничениям по странам `canbedisplayed`, `isvalidforcurrentcountry`, но они привязаны к битовым полям, которых у вас просто навсего нету в базе, поэтому они просто бесполезны.

5) Нет линковочных критериев авто к артиклям, или по крайне мере я их не вижу ни в примере ни в показанных таблицах.

6) Таблица `country_groups` должна ссылаться на страны из таблицы `countries`, чтобы можно было понять, какие страны входят в группу стран. Хотя без применимости и ограничений по странам, это бесполезная таблица.

7) У Вас не все изображения артиклей.

И еще множества других мелочей и особенностей. Вы явно не понимаете до конца, что Вы делаете, и поэтому получился такой вот результат.

Если кому-то нужна нормальная мультиязычная база TecDoc 2017Q2 в MySQL формате, без дубликатов и непонятных полей и со всеми изображениями, пишите на seomoneys@gmail.com.
tecdocru
Дата: 17.06.2017 23:10:18
Первое и самое главное - база создана абсолютно идентичной родной текдоковской. Как немцы назвали все, какие поля поставили - все скопировано, дабы не навредить. Поэтому про винегрет ближе к Новому году.

5. Мы уже опубликовали класс для тех, у кого не получается самостоятельно. В этом классе есть все необходимые запросы, включая связь артикула с ТС. Будьте внимательны.

7. Скиньте список недостающих? Иначе это просто домыслы.

Мы за Вами давно наблюдаем. Вместо здоровой конкуренции, от вас везде льется одна необоснованная грязь. Вы американец что-ли? У них это вошло в привычку бездоказательно обвинять. Ваши потуги сохранить доход вполне понятны, но давайте придерживаться общепринятых правил ведения бизнеса. Здоровая конкуренция. Не надо пытаться себя возвысить, опуская других. Оно как правило боком выходит. И со стороны люди все видят и сделают необходимые выводы. Кто молча работает, а кто ходит по форумам и за глаза поливает грязью.

seomoneys
tecdocru,

У Вас не база, а какой-то винегрет:

1) В обход нормальным формам, некоторые сущности дублируются множества раз, вместо того чтобы быть объявлены один раз с первичным ключем и ссылаться на них через этот первичный ключ.

2) Использование VARCHAR поля `datasupplierarticlenumber` в качестве индекса, на таблицах объемом в 150-200 млн. строк, раздувает вашу базу до 200 ГБ. И к тому же дает неоднозначность привязки данных, поскольку datasupplierarticlenumber не уникален и у Вас есть вероятность получить таким образом данные для других артиклей.

3) Некоторые поля лишены логического смысла, к примеру `axles`.`iscommercialvehicle`, `axles`.`iscvmanufacturerid`, `axles`.`isengine`, `axles`.`ismotorbike`, `axles`.`ispassengercar`, `axles`.`istransporter` всегда будут 0(false) а `axles`.`isaxle` 1(true). Тоже самое и в других таблицах.

4) Вы выгрузили поля, которые относятся к ограничениям по странам `canbedisplayed`, `isvalidforcurrentcountry`, но они привязаны к битовым полям, которых у вас просто навсего нету в базе, поэтому они просто бесполезны.

5) Нет линковочных критериев авто к артиклям, или по крайне мере я их не вижу ни в примере ни в показанных таблицах.

6) Таблица `country_groups` должна ссылаться на страны из таблицы `countries`, чтобы можно было понять, какие страны входят в группу стран. Хотя без применимости и ограничений по странам, это бесполезная таблица.

7) У Вас не все изображения артиклей.

И еще множества других мелочей и особенностей. Вы явно не понимаете до конца, что Вы делаете, и поэтому получился такой вот результат.

Если кому-то нужна нормальная мультиязычная база TecDoc 2017Q2 в MySQL формате, без дубликатов и непонятных полей и со всеми изображениями, пишите на seomoneys@gmail.com.
fatslon
Дата: 24.06.2017 14:19:27
Действительно, tecdocru совершенно прав. Из за этого предпочитаю не искать инфу на русскоязычных форумах, где на любой вопрос потоками льётся грязь.

Извините за оффтоп выше.

Вопрос, раньше tecdoc подключался через ODBC Transbase, а как сейчас? В 32bit system DSN драйверов с похожим именем теперь нет.

Буду признателен, если кто-то сможет подсказать новые способ и параметры подключения.
tecdocru
Дата: 25.06.2017 02:31:22
fatslon
Действительно, tecdocru совершенно прав. Из за этого предпочитаю не искать инфу на русскоязычных форумах, где на любой вопрос потоками льётся грязь.

Извините за оффтоп выше.

Вопрос, раньше tecdoc подключался через ODBC Transbase, а как сейчас? В 32bit system DSN драйверов с похожим именем теперь нет.

Буду признателен, если кто-то сможет подсказать новые способ и параметры подключения.


Раньше на дисках был текдок с полной базой информации о запчастях, транспорте, связях и прочем. А смысл все что есть на диске - это "оболочка" к веб-сервису Tecalliance. Поэтому особого смысла к нему искать подключения нету. Данные все лежат у немцев и на дисках они их больше никому не отправляют.
Bettler
Дата: 27.06.2017 08:32:27
seomoneys
tecdocru,
У Вас не база, а какой-то винегрет:
...
Если кому-то нужна нормальная мультиязычная база TecDoc 2017Q2 в MySQL формате, без дубликатов и непонятных полей и со всеми изображениями, пишите ...


Для начала взглянуть бы на структуру базы без бла-бла-бла, те же "линковочные критерии авто к артиклям", как вы выражаетесь.
asunny
Дата: 05.07.2017 18:41:30
Обясните логику как новый текдок сложить в ЦСВ... ПЛИЗ.
Знаком с SQL и C#.
С текдоком опыта не имею.

asunny собака mail.ru
tecdocru
Дата: 10.08.2017 05:38:41
По многочисленным просьбам, выводим на рынок новый продукт - TECDOC.RU OEM2CAR. Очень многим нужно определять на какие автомобили подходит та или иная запчасть, и большинство из этих людей, не готовы заморачиваться с построением запросов к TECDOC, да и самой покупке целой системы, ради одной только функции.

OEM2CAR - это mySQL таблица, которая простым запросом к ней выдает применяемость оригинального номера.

Как это работает на практике, Вы можете потестировать на бесплатном API: http://api.tecdoc.ru/oemcars/0446560330, замените 0446560330 на любой OEM-номер и система выдаст применяемость в JSON-формате.

Сама таблица весит около 400Мб в формате SQL. В ZIP-архиве - 17Мб.

Сейчас проект OEM2CAR находится в режиме тестирования, поэтому отнеситесь с пониманием, если вдруг чего-то не будет хватать.

Стоимость OEM2CAR.SQL составляет 5 000 руб. Готовы ответить на все Ваши вопросы: info@tecdoc.ru
xtd
Дата: 09.08.2018 15:33:35
tecdocru,

Отвечаете вы ооочень "быстро"... Купил у вас версию 1Q2018 и запрос по аналогам-заменителям теперь выполняется в пять раз дольше чем в версии 3Q2017! Напрасно потраченные деньги! А вы так и НЕ отвечаете!
tecdocru
Дата: 12.08.2018 12:04:22
Я вчера ответ прислал со скриншотами! Как я и говорил, проблема не в базе, а в чем-то другом.

Потратил полдня, чтобы развернуть 3Q2017 и запустить указанный Вами запрос.

У меня его выполнение на 3Q2017 заняло 0.435сек, и выдало 32 записи.
[img]https://preview.ibb.co/d35sT9/image.png[/img]

Запустил тот же запрос в 1Q2018. Его выполнение заняло 0.216сек и выдало 34 записи.
[img]https://preview.ibb.co/bGqgMU/image_1.png[/img]

Либо у вас сервер mysql не настроен, либо вы после импорта не проанализировали все таблицы, чтобы индексы создались, либо железо у вас в принципе не заточено под базы такого уровня, либо вы вводите нас в заблуждение, чтобы и базу сохранить, и деньги вернуть. Я повторюсь, с базой все в порядке.